Java POI 导出Excel(一)

序言

上篇序言已经说明了我为什么要写这个教程了,如果想知道请戳这个链接:序言。那么废话就不多说开始吧。

POI Maven 依赖

POI官网:http://poi.apache.org/,我当前使用的版本是3.15。Maven依赖如下:

	<dependencies>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.15</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.15</version>
		</dependency>
	</dependencies>

POI读取Office2007以上版本的xlsx文件

实例代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
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;

public class WorkbookExample {
		
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
	
	/**
	 * 导出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
	
	public static void main(String[] args) throws Exception {
		//读入文件流
		InputStream inputStream = new FileInputStream(new File(path));
		//创建Excel对象
		Workbook wb = WorkbookFactory.create(inputStream);
		//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
		Sheet sheet = wb.getSheetAt(0);
		//创建第一行
		Row row = sheet.createRow(0);
		//设置A1的值
		row.createCell(0).setCellValue("A1");
		//输出文件
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------输出成功");
	}
}

可见输出的文件:


打开之后可见A1的值为A1:


POI读取Office2007以下版本的xls文件

POI读取2007版本以下的Excel即可以使用Workbook类,也可以使用HSSFWorkbook类。但是注意,HSSFWorkbook不能读取*.xlsx后缀的文件,因为不兼容。

HSSFWorkbook实例代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

public class HSSFWorkbookExample {
	
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example2.xls";
	
	/**
	 * 导出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example12-export.xls";
	
	public static void main(String[] args) throws Exception {
		//读入文件流
		InputStream inputStream = new FileInputStream(new File(path));
		//创建Excel对象
		HSSFWorkbook wb = new HSSFWorkbook(inputStream);
		//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
		Sheet sheet = wb.getSheetAt(0);
		//创建第一行
		Row row = sheet.createRow(0);
		//设置A1的值
		row.createCell(0).setCellValue("A1");
		//输出文件
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------输出成功");
	}
}

运行后输出文件:


打开后可见输出结果:


如果HSSFWorkbook读取Excel2007版本以上的文件就会导致报错:

Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
	at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:398)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:379)
	at com.poi.example.HSSFWorkbookExample.main(HSSFWorkbookExample.java:27)

单元格合并

在POI的设定之中是需要先定义好合并单元格再创建行的。实例如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
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.ss.util.CellRangeAddress;

public class WorkbookExample2 {
		
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
	
	/**
	 * 导出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
	
	public static void main(String[] args) throws Exception {
		//读入文件流
		InputStream inputStream = new FileInputStream(new File(path));
		//创建Excel对象
		Workbook wb = WorkbookFactory.create(inputStream);
		//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
		Sheet sheet = wb.getSheetAt(0);
		/*
		 * 这里 第一个参数是起始行,第二个参数是结束行。
		 * 第三个参数是起始列,第四个参数是结束列
		 * 本例中的含义是A1和A2合并
		 * 
		 * */
		sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
		//创建第一行
		Row row = sheet.createRow(0);
		//设置A1的值
		row.createCell(0).setCellValue("A1");
		//输出文件
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------输出成功");
	}
}

输出结果如下:


数据格式

数据格式网上有许多正确实例代码来说明各种数据类型是如何格式化的。此处只是提及一下如何引入格式化。实例代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
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.ss.util.CellRangeAddress;

public class WorkbookExample3 {
		
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
	
	/**
	 * 导出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
	
	public static void main(String[] args) throws Exception {
		//读入文件流
		InputStream inputStream = new FileInputStream(new File(path));
		//创建Excel对象
		Workbook wb = WorkbookFactory.create(inputStream);
		//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
		Sheet sheet = wb.getSheetAt(0);
		/*
		 * 这里 第一个参数是起始行,第二个参数是结束行。
		 * 第三个参数是起始列,第四个参数是结束列
		 * 本例中的含义是A1和A2合并
		 * 
		 * */
		sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
		//创建第一行
		Row row = sheet.createRow(0);
		//设置A1的值
		row.createCell(0).setCellValue(100.22222222222222222d);
		//设置数据类型
		//setCellType(0)是一个过时的方法,并不建议使用
		//row.getCell(0).setCellType(0);
		//设置保留2位小数
		row.getCell(0).setCellType(CellType.NUMERIC);
		//设置保留小数位
		DataFormat format = wb.createDataFormat();
		CellStyle style = wb.createCellStyle();
		style.setDataFormat(format.getFormat("0.00"));
		row.getCell(0).setCellStyle(style);
		
		//输出文件
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------输出成功");
	}
}

输出结果:


结束语

本篇文章先介绍到这里,后续的具体样式调整下一个篇幅再更新。

下一篇:Java POI 导出Excel(二)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值