- 浏览: 217093 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
zi_wu_xian:
顶5楼,POI操作word和excel还是太复杂了,并且针对d ...
使用POI操作Excel和Word -
贝塔ZQ:
poi操作word、excel代码好多啊,用插件试试吧,网上不 ...
使用POI操作Excel和Word -
wap816:
@CacheEvict(value = ...
SpringEL详解及应用 -
string2020:
List<Map<String,Map<St ...
开源工具 — Apache Commons Collections -
uniqueX:
mark!
并发编程 — 判断线程安全
前言:今天在项目中看到有小模块是上传Excel解释后保存到数据库的操作,好奇之下去了解了如何使用Apache POI操纵Excel和Word,以下为小分享
什么是POI?
POI是Apache下的一个项目,是用Java编写的开源框架,提供API供开发者直接操作Microsoft Office(Excel,Word,PowerPoint...)
POI为我们带来了什么?
在很多的企业当中,储蓄数据是使用Excel文档的,因为Excel文档的格式方便,也能套用公式,而企业程序是存储在数据库当中,这样就需要一种两者之间互相转换的方法,当企业刚开始使用信息化的管理系统时,也需要将Excel的数据录入到程序当中,这种需求是非常普遍的.
POI使用:
首先增加Maven的依赖
<!-- POI核心依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </dependency> <!-- 为POI支持Office Open XML --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.8</version> </dependency> <!-- 支持Word文档的操作 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.8</version> </dependency>
以下为操作Excel的测试类
package com.accentrix.ray; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.Before; import org.junit.Test; public class TestExcel { private Workbook workbook; /* * 由于Excel当中的单元格Cell存在类型,若获取类型错误 就会产生错误, * 所以通过此方法将Cell内容全部转换为String类型 */ private String getCellValue(Cell cell) { String str = null; switch (cell.getCellType()) { case Cell.CELL_TYPE_BLANK: str = ""; break; case Cell.CELL_TYPE_BOOLEAN: str = String.valueOf(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: str = String.valueOf(cell.getCellFormula()); break; case Cell.CELL_TYPE_NUMERIC: str = String.valueOf(cell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: str = String.valueOf(cell.getStringCellValue()); break; default: str = null; break; } return str; } @Before public void setUp() throws InvalidFormatException, IOException { // 加载excel文件,自动判断是HSSF还是XSSF workbook = WorkbookFactory.create(new File("E:/aaa.xls")); } /* * 读取一个已存在的Excel */ @Test public void testReadExcel() throws InvalidFormatException, IOException { // 获取第一个工作目录,下标从0开始 Sheet sheet = workbook.getSheetAt(0); // 获取该工作目录最后一行的行数 int lastRowNum = sheet.getLastRowNum(); for (int i = 0; i < lastRowNum; i++) { // 获取下标为i的行 Row row = sheet.getRow(i); // 获取该行单元格个数 int lastCellNum = row.getLastCellNum(); for (int j = 0; j < lastCellNum; j++) { // 获取下标为j的单元格 Cell cell = row.getCell(j); // 调用获取方法 String cellValue = this.getCellValue(cell); } } } /* * 使用Foreach方式读取Excel */ @Test public void testForeachReadExcel() { // 根据sheet的名字获取 Sheet sheet = workbook.getSheet("test"); // 处了上面testReadExcel的方式读取以外,还支持foreach的方式读取 for (Row row : sheet) { for (Cell cell : row) { String cellValue = this.getCellValue(cell); System.out.println(cellValue); } } } /* * 创建简单的Excel */ @Test public void testWriteExcel() throws IOException { // 创建一个XSSF的Excel文件 workbook = new XSSFWorkbook(); FileOutputStream fos = new FileOutputStream("E:/test.xlsx"); // 创建名称为test的工作目录 Sheet sheet = workbook.createSheet("test"); /* * 创建1个10行x10列的工作目录 */ for (int i = 0; i < 10; i++) { // 创建一行 Row row = sheet.createRow(i); for (int j = 0; j < 10; j++) { // 创建一个单元格 Cell cell = row.createCell(j); // 设置单元格value cell.setCellValue("test"); // 此处为设置Excel的样式,设置单元格内容居中, // 但这样设置方式并不常用,请留意下面的方法 CellStyle cs = workbook.createCellStyle(); cs.setAlignment(CellStyle.ALIGN_CENTER); cell.setCellStyle(cs); } } // 将Excel写出到文件流 workbook.write(fos); } /* * 通过使用模板生成Excel文件,模板当中包含样式, * 这样我们只为模板填充数据就可以有相应的样式 */ @Test public void testWriteExcelByTemplate() throws InvalidFormatException, IOException { String fileName = "test.xlsx"; // 通过类加载器获取模板 workbook = WorkbookFactory.create(this.getClass().getClassLoader() .getResourceAsStream(fileName)); FileOutputStream fos = new FileOutputStream("E:/test.xlsx"); Sheet sheet = workbook.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(0); /* * 此时可以通过getCellStyle()来获取到该单元格对象的样式, * 获取到样式只要将此样式放入新创建Excel单元格中, * 就可以完成样式的替换 获取可以直接填充此模板再进行输出, * 注意插入新一行时,要使用sheet.shiftRows(0, 7, 1, true, true); * 这里代表从第0行到第7向下移动1行,保持宽度和高度 */ CellStyle cellStyle = cell.getCellStyle(); workbook.write(fos); } }
以下为操作Word的测试类
package com.accentrix.ray; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import junit.framework.Assert; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.Borders; import org.apache.poi.xwpf.usermodel.LineSpacingRule; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.TextAlignment; import org.apache.poi.xwpf.usermodel.UnderlinePatterns; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestWord { // 生成Word2007版本 private FileInputStream fis2007; private XWPFDocument doc2007; private XWPFWordExtractor word2007; // 生成Word2003版本 private FileInputStream fis2003; private HWPFDocument doc2003; private WordExtractor word2003; // 创建Word输出流 private FileOutputStream fos; @Before public void setUp() throws Exception { // 初始化2007版本 fis2007 = new FileInputStream(new File("D:/test.docx")); doc2007 = new XWPFDocument(fis2007); word2007 = new XWPFWordExtractor(doc2007); // 初始化2003版本 fis2003 = new FileInputStream(new File("D:/test2.doc")); doc2003 = new HWPFDocument(fis2003); word2003 = new WordExtractor(doc2003); // 初始化输出流 fos = new FileOutputStream(new File("D:/testCreateWord.docx")); } @Test public void testReadWord2003() { // 直接通过getText()获取文本 String text = word2003.getText(); // 获取总页数 doc2003.getSummaryInformation().getPageCount(); // 获取总字数 doc2003.getSummaryInformation().getWordCount(); Assert.assertNotNull(text); } @Test public void testReadWord2007() { // 直接通过getText()获取文本 String text = word2007.getText(); // 获取总页数 doc2007.getProperties().getExtendedProperties() .getUnderlyingProperties().getPages(); // 获取去除空格的总页数 doc2007.getProperties().getExtendedProperties() .getUnderlyingProperties().getCharacters(); // 获取带空格的总页数 doc2007.getProperties().getExtendedProperties() .getUnderlyingProperties().getCharactersWithSpaces(); Assert.assertNotNull(text); } /* * 演示如何创建Word文档 */ @Test public void testWriteWord2007() throws IOException { XWPFDocument doc = new XWPFDocument(); // 创建段落 XWPFParagraph p1 = doc.createParagraph(); // 设置样式,此时样式为一个正方形包围文字 p1.setAlignment(ParagraphAlignment.CENTER); p1.setBorderBottom(Borders.DOUBLE); p1.setBorderTop(Borders.DOUBLE); p1.setBorderRight(Borders.DOUBLE); p1.setBorderLeft(Borders.DOUBLE); p1.setBorderBetween(Borders.SINGLE); p1.setVerticalAlignment(TextAlignment.TOP); // 创建1段文字,通过段落创建 XWPFRun r1 = p1.createRun(); // 设置是否粗体 r1.setBold(true); r1.setText("The quick brown fox"); r1.setBold(true); r1.setFontFamily("Courier"); r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH); r1.setTextPosition(100); XWPFParagraph p2 = doc.createParagraph(); p2.setAlignment(ParagraphAlignment.RIGHT); p2.setBorderBottom(Borders.DOUBLE); p2.setBorderTop(Borders.DOUBLE); p2.setBorderRight(Borders.DOUBLE); p2.setBorderLeft(Borders.DOUBLE); p2.setBorderBetween(Borders.SINGLE); XWPFRun r2 = p2.createRun(); r2.setText("Hello Hello Hello Hello Hello Hello Hello"); r2.setStrike(true); r2.setFontSize(20); XWPFRun r3 = p2.createRun(); r3.setText("World World World World World World World"); r3.setStrike(true); r3.setFontSize(20); XWPFParagraph p3 = doc.createParagraph(); p3.setWordWrap(true); // 设置该段落填充满本页,下面在显示新文本将在下一页显示 p3.setPageBreak(true); p3.setAlignment(ParagraphAlignment.DISTRIBUTE); p3.setAlignment(ParagraphAlignment.BOTH); p3.setSpacingLineRule(LineSpacingRule.EXACT); p3.setIndentationFirstLine(600); doc.write(fos); } @After public void tearDown() throws IOException { if (fis2003 != null) { fis2003.close(); } if (fis2007 != null) { fis2007.close(); } if (fos != null) { fos.close(); } } }
总结:
使用POI读取写出Excel文件非常方便,但写出的时候需要注意,是不包含样式的,但若然要结合样式来写出Excel或Word就会变得非常复杂,当有业务需求的时候建议上Apache POI的官网查看相关的API和Demo
评论
6 楼
zi_wu_xian
2016-09-02
顶5楼,POI操作word和excel还是太复杂了,并且针对docx和doc不能写同样的代码,针对xls和xlsx文件也得写不同的代码,用PageOffice动态生成word和excel文件的话,就没这么麻烦
5 楼
贝塔ZQ
2016-09-02
poi操作word、excel代码好多啊,用插件试试吧,网上不少呢,PageOffice就不错,可以试试
4 楼
ray_yui
2013-08-20
海底的乌鸦 写道
敢问楼主用的包是哪个版本的
你好,在Maven配置那里可以看到,<version>3.8</version> ,是用3.8的版本
3 楼
海底的乌鸦
2013-08-20
敢问楼主用的包是哪个版本的
2 楼
ray_yui
2013-08-09
yzsunlight 写道
据说POI对word的支持不太好
其实POI对Word的支持是非常好的,只是API非常的复杂,需要认真研究
1 楼
yzsunlight
2013-08-08
据说POI对word的支持不太好
发表评论
-
并发编程 — 实现线程安全
2015-08-12 09:03 2270并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 优化小技巧
2015-08-10 23:54 0并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 判断线程安全
2015-08-05 10:11 5474并发编程系列文章: ... -
并发编程 — volatile
2015-07-30 10:11 2157并发编程系列文章: 初解线程池:http://r ... -
数据库储存不确定实体
2014-07-08 09:52 2238相信在项目开发当中都曾经遇到过,有某些要储蓄到数 ... -
同步操作降低效率解惑
2014-06-30 10:20 3249相信在读者刚接触Java的时候,都曾经学习到线程 ... -
并发编程 — 并发数据结构
2014-06-24 09:58 5523并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 并发数据类型
2014-06-16 10:03 5405并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 详解线程池
2014-06-03 09:51 5967本文章需要对JDK5 Executor框架有所了解,请读者先 ... -
并发编程 — 初解线程池
2014-05-28 09:57 7501并发编程系列文章: 初解线程池:http://r ... -
线程池详解
2014-05-26 18:20 0本文章需要对JDK5 Executor框架有所了 ... -
高级字节码生成工具 — Javassist
2014-03-11 09:57 6369AOP系列文章: Spring AOP:http ... -
实现AOP — CGLIB
2014-03-06 09:50 3930AOP系列文章: Sp ... -
实现AOP — Spring AOP
2014-03-03 10:02 4217AOP系列文章: Spring AOP:http ... -
cglib
2014-01-11 19:11 0什么是CGLIB? CGLIB是一个强大的高性能 ... -
Java高质量代码之 — 杂
2013-09-16 09:53 4701前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ... -
Java高质量代码之 — 异常
2013-09-09 09:35 6653前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ... -
Java高质量代码之 — 泛型与反射
2013-08-29 09:36 18024前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ... -
Hibernate4新获取Connection方式
2013-08-28 11:20 3671在使用Hibernate的过程中,免不了可能需要调用存储过程 ... -
Java高质量代码之 — 枚举与注解
2013-08-27 09:59 15732前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ...
相关推荐
用于java使用poi技术,读取word文档,和生成excel表格
利用POI读取excel写入到word 利用POI读取excel写入到word 利用POI读取excel写入到word,压缩包里包含了jar包
POI处理EXCEL和WORD文件的JAR包和详细资料
POI操作EXCEL、WORD。经典案例,详细讲解。
java读写Excel,POI.JAR,Word内容读取
poi操作excel,word文件,office2003及office2007以上都支持,程序利用poi可提取word文档及excel文档内容生成txt文件,程序中对poi类有定制化改写。
poi对excel和word的读取,支持2003和2007
附件包含一个web项目,是一个简单的解析excel和word的例子,项目中包含jar poi解析excel、word2007,2010等版本
POI是java对Word和Excel 文件操作的插件,这文档主要是教我们怎么使用POI插件对Word和Excel文件进行读写操作
使用POI来处理Excel和Word文件格式
使用poi在excel中生成各种常见的图像,比如饼状图(普通饼状图、三D图,环状体、折线图、柱状图、等~~)
poi操作word和excel实例,自己做的结合网上的,供大家参考!
里面有工具类,包含word和excel。支持doc。docx xls和xlsx等格式。还有稀缺的所有jar包。绝对物有所值
apache poi 导出excel、word,替换word内容,导出word-文本、图片、表格
安卓使用POI读取及修改Word文档,代码已自测
POI操作Excel 合并单元格 边框问题解决方法,这个方法是我亲自测试,并运用于项目中的,可以放心使用,还一并写出了很多注释,其中有写poi的bug的解决方法
使用POI操作word内容,需要使用POI的同学可以看一下,也可以使用POI导入导出EXcel等都可以。
java实现word、excel在线预览。版本2003和2007都支持在线预览,项目需要导入一些poi相关的jar,jar之间的版本有要求。在我的资源列表,有相关的jar包可以下载。
POI处理EXCEL和WORD文件的JAR包和资料
利用poi技术生成excel报表和读取word文档内容