首页编程java编程java中的poi是什么意思,poi是什么意思

java中的poi是什么意思,poi是什么意思

编程之家 2023-10-13 77次浏览

各位老铁们,大家好,今天由我来为大家分享java中的poi是什么意思,以及poi是什么意思的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

java中的poi是什么意思,poi是什么意思

poi是什么意思

兴趣点。

POI是“Point of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。

传统的地理信息采集方法需要地图测绘人员采用精密的测绘仪器去获取一个兴趣点的经纬度,然后再标记下来。正因为POI的采集是一个非常费时费事的工作,对一个地理信息系统来说,POI的数量在一定程度代表着整个系统的价值。

java中的poi是什么意思,poi是什么意思

每个POI包含四方面信息,名称、类别、坐标、分类,全面的POI讯息是丰富导航地图的必备资讯,及时的POI兴趣点能提醒用户路况的分支及周边建筑的详尽信息,也能方便导航中查到你所需要的各个地方,选择最为便捷和通畅的道路来进行路径规划。

扩展资料:

poi数据的应用:

java中的poi是什么意思,poi是什么意思

1、帮助企业更好地捕捉到竞争对手的高价值客户。

能够得到用户的某种POI数据的话,那么就有可能知道用户在大概什么时间、到达了哪些机场、以及他出现在机场的频率高低;

这不但能够更加准确地判断用户作为航空公司客户的真正价值,甚至还能有针对性地设计出对于用户而言非常有吸引力的促销措施,让他更加有可能将更多的此类消费转移过来。

2、为商家提供对市场整体竞争环境的分析(选址)。

POI数据首先能够告诉我们,客户在一个地区的哪些酒店住宿、一年当中住宿的高峰时段和低谷时段是如何分布的。这些信息对于评估一个地区的行业发展趋势、决定未来在这一地区的发展策略

参考资料来源:百度百科-POI

Java poi怎么导入

本篇面向对象为Java的初学者,从下载必备软件到创建一个空白的POI工程,已经熟练掌握环境搭建的请跳过此文。

开发环境为windowsXP-SP2,Eclipse3.2,JDK1.5.07,其实差不多都行,不会有太大的差异。本文从POI下载开始讲解,前提是开发环境包括系统变量等等已经正确设置完毕。

1.POI的下载

截至本文发表,POI最新版本是3.0.1,距离上一个Final版本有3年了吧,以至于我差点儿就把他放弃了——以为没人管了。官方的公告讲,这一版主要是追加了一些新的特性和BUG修正,不过稍微有点儿遗憾的是,还不能很好的操作Excel2007。

POI官方网址:

•http://poi.apache.org/

JAR包下载:

•http://apache.mirror.phpchina.com/poi/release/bin/poi-bin-3.0.1-FINAL-20070705.zip

源码下载:

•http://apache.mirror.phpchina.com/poi/release/src/poi-src-3.0.1-FINAL-20070705.zip

下载上面的JAR和源码(源码不是必须的,但是为了早日修得正果,深入系统的看看POI代码还是有必要的)并解压待用。

2.用Eclipse搭建项目

•打开Eclipse

•依次点击File->New->Java Project

•输入项目名称,本例中设置为POI

•单击完成

•在项目上点击右键->New->Folder

•输入文件夹名称lib

•把刚才解压的poi-3.0.1-FINAL-20070705.jar复制过来

•右键点击项目,选择Properties

•在左侧列表里选中Java Build Path,右侧选中Libraries

•点击Add JARs,选择POI项目的lib下的所有文件

•两次OK确认,回到Eclipse界面

小技巧,快捷操作:可以用鼠标左键选中poi-3.0.1-FINAL-20070705.jar但不松开,拖到任务栏的Eclipse图标上等候1秒左右,Eclipse会自动弹起来,依然不松开移动到lib文件夹上,这个时候鼠标后面跟个十字符号,松开左键,就完成了复制动作。这个是对整个windows系统都好用的快捷复制方式,视源盘符和目标盘符的不同偶尔会用到Ctrl键。

到此为止,我们做好了POI学习的前提准备,接下来将从最简单的文档创建开始一步一步学习怎样让POI更好的为我们工作。

第一讲:基本的Excel读写

本文主要演示一下POI的基本操作,例如怎样读取和创建一个具体的Excel文件。按照惯例,拿HelloWorld说事儿。

说明:本文主要内容皆包含于官方帮助手册,之所以要拿出来,出于两个原因,手册是英文的+手册是对应2.5.1的。

核心代码如下,注释部分为讲解。这里只挑干的讲,完整的代码请参考(下载代码)。

//创建一个空白的WorkBook

HSSFWorkbook wb= new HSSFWorkbook();

//基于上面的WorkBook创建属于此WorkBook的Sheet,

//3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。

HSSFSheet st= wb.createSheet("测试页");

//创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,

//注意,尽管参数是Int类型,但是Excel最多支持65536行

HSSFRow row= st.createRow(0);

//创建属于上面Row的Cell,参数0可以是0~255之间的任何一个,

//同样,是因为Excel最大支持的列数为256列

HSSFCell cell= row.createCell((short) 0);

//设置此单元格的格式为文本,此句可以省略,Excel会自动识别。

//其他还有几种常用的格式,请参考本文底部的补充部分。

cell.setCellType(HSSFCell.CELL_TYPE_STRING);

//此处是3.0.1版的改进之处,上一版可以直接setCellValue("Hello, World!"),

//但是在3.0.1里,被deprecated了。

cell.setCellValue(new HSSFRichTextString("Hello, World!"));

//创建一个文件输出流,指定到C盘根目录下(C盘都有吧?)

//xls是Excel97-2003的标准扩展名,2007是xlsx,目前的POI能直接生产的还是xls格式,

//如果此处把扩展名改成xlsx,在用Excel2007打开此文件时会报错。

FileOutputStream writeFile= new FileOutputStream("c:/helloworld.xls");

//把WorkBook写到流里

wb.write(writeFile);

//记得手动关闭流,官方文档已经做了特别说明,说POI不负责关闭用户打开的流。所以...

writeFile.close();

上面就是创建一个新文档的简易代码,下面的例子是读取刚才创建的Excel并把读取到的内容显示在控制台上。

//指定要读取的文件,本例使用上面生成的helloworld.xls

FileInputStream readFile= new FileInputStream("c:/helloworld.xls");

//创建一个WorkBook,从指定的文件流中创建,即上面指定了的文件流

HSSFWorkbook wb= new HSSFWorkbook(readFile);

//获取名称为“测试页”的sheet

//注意,如果不能确定具体的名称,可以用getSheetAt(int)方法取得Sheet

HSSFSheet st= wb.getSheet("测试页");

//获得第一行,同上,如果此行没有被创建过则抛出异常

HSSFRow row= st.getRow(0);

//获取第一个单元格,如果没有被创建过则抛出异常

HSSFCell cell= row.getCell((short) 0);

//把cell中的内容按字符串方式读取出来,并显示在控制台上

//注意,getRichStringCellValue()方法是3.0.1新追加的,

//老版本中的getStringCellValue()方法被deprecated了

System.out.println(cell.getRichStringCellValue());

//记得关闭流

readFile.close();

上面对创建和读取分别举例说明,回顾两段代码,不难看出POI操作Excel的“套路”:

•获得一个WorkBook(准确说是HSSFWorkBook,对于POI来说,WorkBook是“另有其类”,以下类同)

•获得要读/写的Sheet对象

•获得要操作的Row对象

•获得最小单位——Cell对象

然后就可以随意的读取、写入了。

--------------------------------------------------------------------------------

关于单元格格式的补充:

单元格一共有如下几种格式,都是HSSFCell类的静态共有属性,

•CELL_TYPE_NUMERIC-数字格式

•CELL_TYPE_STRING-字符串(默认)

•CELL_TYPE_FORMULA-公式

•CELL_TYPE_BLANK-空白

•CELL_TYPE_BOOLEAN-布尔

•CELL_TYPE_ERROR-错误

第二讲:单元格边框、字体及颜色

此文概要性的讲述了一下单元格的边框、字体以及颜色的设置方式,在POI中,这一切都是通过实例化HSSFCellStyle对象来实现的,HSSFCellStyle类还有很多其他实际有用方法,本例中只是取平时用的比较普遍的一些设置来做演示的。好,开始讲解了……

//设置行号

row.setHeightInPoints((short) 50);

//设置列宽,(256* 50)这种写法是因为width参数单位是单个字符的256分之一

st.setColumnWidth(cell.getCellNum(),(short)(256* 50));

//让HSSFWorkbook创建一个单元格样式的对象

//小技巧:在多处用到完全一样的样式的时候可以用工厂模式生产

HSSFCellStyle cellStyle= wb.createCellStyle();

//设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle

cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);

cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

//这个地方是用来在单元格里画斜线的

//原理是在指定的两个点之间画线,然后默认情况此线会随着单元格的变化而变化

//类似Excel那种设置边框的方式达到的斜线效果目前好像POI不支持

//如果是我疏忽了请记得告诉我一些,先行谢过啦

HSSFPatriarch patriarch= st.createDrawingPatriarch();

HSSFClientAnchor anchor= new HSSFClientAnchor();

anchor.setAnchor(cell.getCellNum(), row.getRowNum(), 0, 0,(short)(cell.getCellNum()+ 1),

row.getRowNum()+ 1, 0, 0);

patriarch.createSimpleShape(anchor);

//设置单元格的文本方式为可多行编写方式

cellStyle.setWrapText(true);

//设置单元格的填充方式,以及前景颜色和背景颜色

//三点注意:

// 1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;

// 2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;

// 3.前景颜色不是字体颜色。

cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);

cellStyle.setFillForegroundColor(HSSFColor.RED.index);

cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);

//设置单元格底部的边框及其样式和颜色

//这里仅设置了底边边框,左边框、右边框和顶边框同理可设

cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);

cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);

//创建一个字体对象,因为字体也是单元格格式的一部分,所以从属于HSSFCellStyle

//下面几个字体的相关设置望文生义,就不用一一说明了吧

HSSFFont font= wb.createFont();

font.setFontName("宋体");

font.setItalic(true);

font.setColor(HSSFColor.BLUE.index);

font.setFontHeightInPoints((short) 20);

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

//将字体对象赋值给单元格样式对象

cellStyle.setFont(font);

//将单元格样式对应应用于单元格

cell.setCellStyle(cellStyle);

这样就OK了,可以可以看到效果了。

补充,各个章节的例子最终都在同一个附件内,下载的时候下任何一个页面内的都可以,都是一样的。

Java-Excel报表开发POI—合并、分组及冻结

Java-Excel报表开发POI系列讲座

第三讲:单元格的合并、数据行的分组以及Excel窗口的冻结

本来想把这三个东西分开来实现的,后来发现分开后内容都很少,于是就合在一起说吧。那总不能干巴巴的列几个例子就完了吧,那就拿比较初级但又会经常遇到的表格类数据的统计的设计来做个小例子。(源码下载)

结果发现——还真够辛苦的。

这次先看效果图吧,其中的竖排并不是真正意义上Excel那种设置的竖排,而是稍微转变了一下输出的方式实现的,因为老外的英文单词没有这种竖排的可能(顶多是旋转,但是那样字体就变了)。除此之外想到的另外一种竖排文字的实现方式就是样式旋转+字体旋转,没测试,不知道是否可用,谁有功夫实现一下,然后记得告诉我结果啊。

老样子,把核心的代码和简要的说明列出来大家看一下吧。

//这里首先创建一个单元格样式对象,设置了四周的边框以及字体可以换行

//其中的字体换行是用来竖向显示其中的一个单元格的

//更好的一点儿做法是再做一个单独的单元格样式对象

//要不然在处理自动列宽的时候可能会有点儿小问题

HSSFCellStyle normalStyle= wb.createCellStyle();

normalStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

normalStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

normalStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

normalStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

normalStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

normalStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

normalStyle.setWrapText(true);

//合并单元格A1-C1,填入内容的时候添到第一个格子里就可以

//但是注意一点:单元格合并後设置边框只在原第一个上有效,

//如果想应用的合并後的整体,则需要一个个的Create出单元格并应用样式

//这个明显是一个不太方便的操作,期待POI下一版的改进了

st.addMergedRegion(new Region(0,(short) 0, 0,(short) 2));

HSSFRow row= st.createRow(0);

HSSFCell cell= row.createCell((short) 0);

cell.setCellValue(new HSSFRichTextString("业务一览表"));

cell.setCellStyle(normalStyle);

row.createCell((short) 1).setCellStyle(normalStyle);

row.createCell((short) 2).setCellStyle(normalStyle);

//设置列头,当然也可以一个一个格子的写,用循环感觉有些取巧而已

//同样,需要单独给每个单元格应用样式对象

String[] seasonName={"第一季度","第二季度","第三季度","第四季度"};

for(short i= 3; i< 7; i++)

{

cell= row.createCell(i);

cell.setCellValue(new HSSFRichTextString(seasonName[i- 3]));

cell.setCellStyle(normalStyle);

}

//这个是竖排文字的实现

//目前POI没找到(或许没提供,或许我无知)让文字竖排的方法,

// HSSFCellStyle.setRotation()方法是设置旋转角度的,和竖排不太一样,

//后来想了一下,因为只有中文等全角字符才有竖排的可能,

//一个英文单词要是竖排看起来恐怕会非常怪异,不过不排除搞艺术的……

st.addMergedRegion(new Region(1,(short) 0, 6,(short) 0));

row= st.createRow(1);

cell= row.createCell((short) 0);

cell.setCellValue(new HSSFRichTextString("地\n区\n代\n理\nA"));

cell.setCellStyle(normalStyle);

for(int i= 2; i< 7; i++)

st.createRow(i).createCell((short) 0).setCellStyle(normalStyle);

//属于地区的二级分类,竖向合并相邻的两个单元格,其他同上

String[] shopName={"连锁店A","连锁店B","连锁店C"};

for(int i= 1; i< 6; i= i+ 2)

{

row= st.createRow(i);

cell= row.createCell((short) 1);

cell.setCellValue(new HSSFRichTextString(shopName[(i- 1)/ 2]));

cell.setCellStyle(normalStyle);

st.createRow(i+ 1).createCell((short) 1).setCellStyle(normalStyle);

st.addMergedRegion(new Region(i,(short) 1, i+ 1,(short) 1));

}

//属于连锁店的下一级,基本也是创建出来然后赋值+应用样式

for(int i= 1; i< 7; i= i+ 2)

{

cell= st.getRow(i).createCell((short) 2);

cell.setCellValue(new HSSFRichTextString("收入"));

cell.setCellStyle(normalStyle);

cell= st.getRow(i+ 1).createCell((short) 2);

cell.setCellValue(new HSSFRichTextString("支出"));

cell.setCellStyle(normalStyle);

}

//数据部分,直接Create然后应用样式,有数据的话这个地方就打数据好了

for(int i= 1; i< 7; i++)

for(short j= 3; j< 7; j++)

st.createRow(i).createCell(j).setCellStyle(normalStyle);

//冻结Excel的窗口,边界为数据部分的边界

st.createFreezePane(3, 1);

//按照连锁店级别分组(当然实际情况这样分组没啥意义)

for(int i= 1; i< 7; i= i+ 2)

st.groupRow(i, i);

//按照地区分组

st.groupRow(1, 5);

其实这样实现起来是不是很麻烦呢?答案是:是。

其实这只是举个例子,熟悉一下POI的各种API而已,真正要实现这样一个表格的时候,例如项目需要制作报表等等,通常的做法都是事先把格式一切的东西都手动制作好(这个做好了的文件在实际的项目里我们称之为“数据模板”,简称“模板”),然后在Java应用中适当的时机把这个文件读进来修改,最后再另存到指定的位置或者传递给下一个处理者(例如以流的方式送给Servlet等等),这样其实POI具体做的事情就是向模板里写业务的数据,还是很方便快捷的。

java 中用poi读取word和用docx4j读取word

不知道你是具体读取Word里面的什么元素,下面以读取文字和图片为例吧,两个代码示例,你参考看看:

读取文本

import com.spire.doc.Document;

import java.io.FileWriter;

import java.io.IOException;

public class ExtractText{

public static void main(String[] args) throws IOException{

//加载Word文档

Document document= new Document();

document.loadFromFile("C:\\Users\\Administrator\\Desktop\\sample.docx");

//获取文档中的文本保存为String

String text=document.getText();

//将String写入Txt文件

writeStringToTxt(text,"ExtractedText.txt");

}

public static void writeStringToTxt(String content, String txtFileName) throws IOException{

FileWriter fWriter= new FileWriter(txtFileName,true);

try{

fWriter.write(content);

}catch(IOException ex){

ex.printStackTrace();

}finally{

try{

fWriter.flush();

fWriter.close();

} catch(IOException ex){

ex.printStackTrace();

}

}

}

}

2.读取图片

import com.spire.doc.Document;

import com.spire.doc.documents.DocumentObjectType;

import com.spire.doc.fields.DocPicture;

import com.spire.doc.interfaces.ICompositeObject;

import com.spire.doc.interfaces.IDocumentObject;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import java.util.Queue;

public class ExtractImages{

public static void main(String[] args) throws IOException{

//加载Word文档

Document document= new Document();

document.loadFromFile("C:\\Users\\Administrator\\Desktop\\sample.docx");

//创建Queue对象

Queue nodes= new LinkedList();

nodes.add(document);

//创建List对象

List images= new ArrayList();

//遍历文档中的子对象

while(nodes.size()> 0){

ICompositeObject node= nodes.poll();

for(int i= 0; i< node.getChildObjects().getCount(); i++){

IDocumentObject child= node.getChildObjects().get(i);

if(child instanceof ICompositeObject){

nodes.add((ICompositeObject) child);

//获取图片并添加到List

if(child.getDocumentObjectType()== DocumentObjectType.Picture){

DocPicture picture=(DocPicture) child;

images.add(picture.getImage());

}

}

}

}

//将图片保存为PNG格式文件

for(int i= 0; i< images.size(); i++){

File file= new File(String.format("output/图片-%d.png", i));

ImageIO.write(images.get(i),"PNG", file);

}

}

}

注意这里使用的jar包是spire.doc.jar,需要在java程序中先导入jar文件。

关于java中的poi是什么意思的内容到此结束,希望对大家有所帮助。

什么是java包装类型 什么是java中的包装类 徐渭熊扮演者(雪中悍刀行徐渭熊扮演者)