- 浏览: 220247 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
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 2309并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 优化小技巧
2015-08-10 23:54 0并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 判断线程安全
2015-08-05 10:11 5559并发编程系列文章: ... -
并发编程 — volatile
2015-07-30 10:11 2204并发编程系列文章: 初解线程池:http://r ... -
数据库储存不确定实体
2014-07-08 09:52 2294相信在项目开发当中都曾经遇到过,有某些要储蓄到数 ... -
同步操作降低效率解惑
2014-06-30 10:20 3295相信在读者刚接触Java的时候,都曾经学习到线程 ... -
并发编程 — 并发数据结构
2014-06-24 09:58 6641并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 并发数据类型
2014-06-16 10:03 5451并发编程系列文章: 初解线程池:http://r ... -
并发编程 — 详解线程池
2014-06-03 09:51 6014本文章需要对JDK5 Executor框架有所了解,请读者先 ... -
并发编程 — 初解线程池
2014-05-28 09:57 7558并发编程系列文章: 初解线程池:http://r ... -
线程池详解
2014-05-26 18:20 0本文章需要对JDK5 Executor框架有所了 ... -
高级字节码生成工具 — Javassist
2014-03-11 09:57 6426AOP系列文章: Spring AOP:http ... -
实现AOP — CGLIB
2014-03-06 09:50 3978AOP系列文章: Sp ... -
实现AOP — Spring AOP
2014-03-03 10:02 4269AOP系列文章: Spring AOP:http ... -
cglib
2014-01-11 19:11 0什么是CGLIB? CGLIB是一个强大的高性能 ... -
Java高质量代码之 — 杂
2013-09-16 09:53 4750前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ... -
Java高质量代码之 — 异常
2013-09-09 09:35 6744前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ... -
Java高质量代码之 — 泛型与反射
2013-08-29 09:36 18073前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ... -
Hibernate4新获取Connection方式
2013-08-28 11:20 3717在使用Hibernate的过程中,免不了可能需要调用存储过程 ... -
Java高质量代码之 — 枚举与注解
2013-08-27 09:59 15827前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间 ...
相关推荐
用于java使用poi技术,读取word文档,和生成excel表格
在IT行业中,Apache POI是一个广泛使用的开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。本篇文章将详细讲解如何利用Apache POI库来读取Excel数据并将其写入到Word文档中。 首先,...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如...以上就是关于使用Apache POI处理Excel和Word文件的关键知识点。通过深入理解和实践,你可以高效地在Java应用中实现对这些文件的读写和操作。
Apache POI是一个开源项目,主要用于读取和写入Microsoft Office格式的文件,包括Excel和Word。这个项目在Java开发环境中非常受欢迎,因为它提供了处理这些文件的强大功能,而无需依赖Microsoft Office套件。以下是...
java读写Excel,POI.JAR,Word内容读取
总的来说,使用Apache POI在Android中生成Word和Excel文档涉及了多个步骤,包括数据读取、文件操作、文档结构构建以及格式化。这个过程需要对XML、Java I/O、Android文件系统权限管理和POI API有深入理解。开发者...
Apache POI是一个广泛使用的开源库,它允许开发者用纯Java代码操作微软的Office格式,包括Word(.doc)、Excel(.xls)和PowerPoint(.ppt)等。在"安卓使用POI读取及修改Word文档"这个主题中,我们将深入探讨如何在...
本篇将详细介绍如何使用Apache POI进行Excel和Word的操作,并通过经典案例来深入理解其用法。 **一、Excel操作** 1. **读取Excel文件** 使用POI,你可以轻松地读取Excel文件中的数据。首先,需要创建一个`...
标题 "POI导出Excel和Word" 涉及到的是使用Apache POI库来创建和操作Microsoft Office格式的文件,特别是Excel和Word文档。Apache POI是一个流行的开源Java库,它允许程序员读写Microsoft Office格式的文件,包括XLS...
本项目中的"poiTest"是一个Web应用示例,它演示了如何使用Apache POI来解析不同版本的Excel(如2007、2010)以及Word2007和2010文档。 1. **Apache POI 简介** Apache POI 是由Apache软件基金会开发的一个项目,...
在IT行业中,Apache POI是一个广泛使用的库,主要用于读取、写入Microsoft Office格式的文件,包括Word(.doc/.docx)和Excel(.xls/.xlsx)文档。本项目提供的"POI实现word和excel在线预览"是基于Apache POI的一个...
本文将深入探讨如何使用POI组件来处理Excel和Word文档,以及如何通过模板动态生成Excel表格。 一、Apache POI简介 Apache POI 是一个开源项目,它的主要功能是读取和写入Microsoft Office格式的文件,如.XLS(Excel...
在Java编程中,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,如Word(.doc或.docx)、Excel(.xls或.xlsx)和PowerPoint(.ppt或.pptx)。本篇文章将深入探讨如何利用POI库在...
Java 使用 POI 合并两个 Word 文档 ...Java 使用 POI 合并两个 Word 文档是非常有用的技术,可以帮助我们快速和高效地合并多个 Word 文档。但是,在实际应用中,我们需要根据具体情况选择合适的合并方式和参数。
在Java世界中,Apache POI库是一个非常强大的工具,它允许开发者读取、写入以及修改Microsoft Office格式的文件,包括Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint(PPT和PPTX)。在这个场景中,"POI操作...
在本文中,我们将深入探讨如何使用Apache POI来创建和修改Excel工作簿,特别是进行写操作。 首先,要使用Apache POI,你需要将其添加到你的项目依赖中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: `...
### POI操作Word和Excel实例详解 #### 一、POI简介 Apache POI是一个流行的Java库,用于处理Microsoft Office格式文件,特别是Excel (.xls, .xlsx) 和 Word (.doc, .docx) 文件。它提供了强大的API来读取、创建、...
POI是java对Word和Excel 文件操作的插件,这文档主要是教我们怎么使用POI插件对Word和Excel文件进行读写操作
### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来...希望本文能够帮助您更好地理解和使用 Apache POI 进行 Excel 文件的操作。