`
ray_yui
  • 浏览: 220248 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用POI操作Excel和Word

阅读更多

前言:今天在项目中看到有小模块是上传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
3
0
分享到:
评论
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的支持不太好

相关推荐

    java使用poi操作excel和word

    用于java使用poi技术,读取word文档,和生成excel表格

    利用POI读取excel写入到word

    在IT行业中,Apache POI是一个广泛使用的开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。本篇文章将详细讲解如何利用Apache POI库来读取Excel数据并将其写入到Word文档中。 首先,...

    POI处理EXCEL和WORD文件的JAR包和资料详细

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如...以上就是关于使用Apache POI处理Excel和Word文件的关键知识点。通过深入理解和实践,你可以高效地在Java应用中实现对这些文件的读写和操作。

    poi操作excel,word文件

    Apache POI是一个开源项目,主要用于读取和写入Microsoft Office格式的文件,包括Excel和Word。这个项目在Java开发环境中非常受欢迎,因为它提供了处理这些文件的强大功能,而无需依赖Microsoft Office套件。以下是...

    java读写Excel,POI.JAR,Word内容读取

    java读写Excel,POI.JAR,Word内容读取

    android中poi生成word文档和excel文档

    总的来说,使用Apache POI在Android中生成Word和Excel文档涉及了多个步骤,包括数据读取、文件操作、文档结构构建以及格式化。这个过程需要对XML、Java I/O、Android文件系统权限管理和POI API有深入理解。开发者...

    安卓使用poi读取及修改word文档

    Apache POI是一个广泛使用的开源库,它允许开发者用纯Java代码操作微软的Office格式,包括Word(.doc)、Excel(.xls)和PowerPoint(.ppt)等。在"安卓使用POI读取及修改Word文档"这个主题中,我们将深入探讨如何在...

    POI操作EXCEL、WORD。经典案例,详细讲解。

    本篇将详细介绍如何使用Apache POI进行Excel和Word的操作,并通过经典案例来深入理解其用法。 **一、Excel操作** 1. **读取Excel文件** 使用POI,你可以轻松地读取Excel文件中的数据。首先,需要创建一个`...

    POI导出Excel和Word

    标题 "POI导出Excel和Word" 涉及到的是使用Apache POI库来创建和操作Microsoft Office格式的文件,特别是Excel和Word文档。Apache POI是一个流行的开源Java库,它允许程序员读写Microsoft Office格式的文件,包括XLS...

    poi解析excel、word2007,2010等版本

    本项目中的"poiTest"是一个Web应用示例,它演示了如何使用Apache POI来解析不同版本的Excel(如2007、2010)以及Word2007和2010文档。 1. **Apache POI 简介** Apache POI 是由Apache软件基金会开发的一个项目,...

    POI实现word和excel在线预览

    在IT行业中,Apache POI是一个广泛使用的库,主要用于读取、写入Microsoft Office格式的文件,包括Word(.doc/.docx)和Excel(.xls/.xlsx)文档。本项目提供的"POI实现word和excel在线预览"是基于Apache POI的一个...

    java 使用poi组件处理 excel word

    本文将深入探讨如何使用POI组件来处理Excel和Word文档,以及如何通过模板动态生成Excel表格。 一、Apache POI简介 Apache POI 是一个开源项目,它的主要功能是读取和写入Microsoft Office格式的文件,如.XLS(Excel...

    java使用poi操作.doc word模板替换,循环插入表格

    在Java编程中,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,如Word(.doc或.docx)、Excel(.xls或.xlsx)和PowerPoint(.ppt或.pptx)。本篇文章将深入探讨如何利用POI库在...

    java 使用POI合并两个word文档.docx

    Java 使用 POI 合并两个 Word 文档 ...Java 使用 POI 合并两个 Word 文档是非常有用的技术,可以帮助我们快速和高效地合并多个 Word 文档。但是,在实际应用中,我们需要根据具体情况选择合适的合并方式和参数。

    POI操作Excel的封装

    在Java世界中,Apache POI库是一个非常强大的工具,它允许开发者读取、写入以及修改Microsoft Office格式的文件,包括Excel(XLS和XLSX)、Word(DOC和DOCX)以及PowerPoint(PPT和PPTX)。在这个场景中,"POI操作...

    使用POI操作Excel文件(写)

    在本文中,我们将深入探讨如何使用Apache POI来创建和修改Excel工作簿,特别是进行写操作。 首先,要使用Apache POI,你需要将其添加到你的项目依赖中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: `...

    poi操作word和excel实例

    ### POI操作Word和Excel实例详解 #### 一、POI简介 Apache POI是一个流行的Java库,用于处理Microsoft Office格式文件,特别是Excel (.xls, .xlsx) 和 Word (.doc, .docx) 文件。它提供了强大的API来读取、创建、...

    PoiWord和Excel 文件操作的插件

    POI是java对Word和Excel 文件操作的插件,这文档主要是教我们怎么使用POI插件对Word和Excel文件进行读写操作

    poi excel poi excel poi excel

    ### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来...希望本文能够帮助您更好地理解和使用 Apache POI 进行 Excel 文件的操作。

Global site tag (gtag.js) - Google Analytics