前言:公司最近需要将所有的报表导出集中到报表中心系统中,需要做一个通用的Excel工具类,让各个业务系统简单高效的生成Excel报表。由于原先各个业务系统生成报表方式都不一样(有的地方还直接使用了CSV),因此需要统一生成Excel。
本来想用easy-poi,但是发现过于复杂,而且我们的需求也偏简单,因此直接使用的是poi原生,使用的是3.8,本来想用新的3.15,但是发现业务系统已经使用了poi3.8,如果我这边使用poui3.15就会出现问题(问题就是程序运行到那个高版本的代码处,而低版本没有那个方法的话,就直接结束,异常什么都没有,这是一个大坑)。
简单粗暴直接贴代码:pom.xml
<!-- poi,excel导出的依赖包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
工具类
package liwenguang.demo.poi.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
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;
import org.apache.poi.ss.util.CellUtil;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil<T> {
/**
* 传入一个模板文件,将模板文件复制到另一个文件里,以后就直接拿复制之后的文件进行操作,而不要动模板文件
*
* @param templateFile
* 模板文件必须存在
* @param outPutUrl
* 输出文件如果存在则会被覆盖
*/
public static void copyTemplate(File templateFile, String outPutUrl, ReportFileTypeEnum fileTyle) {
Workbook wb = null;
NPOIFSFileSystem npoifs = null;
OPCPackage pkg = null;
switch (fileTyle) {
case XLS:
try {
npoifs = new NPOIFSFileSystem(templateFile);
wb = WorkbookFactory.create(npoifs);
} catch (Exception e1) {
e1.printStackTrace();
} finally {
}
break;
case XLSX:
try {
pkg = OPCPackage.openOrCreate(templateFile);
wb = WorkbookFactory.create(pkg);
} catch (Exception e1) {
e1.printStackTrace();
} finally {
}
break;
default:
throw new RuntimeException();
}
try (FileOutputStream fileOut = new FileOutputStream(outPutUrl)) {
wb.write(fileOut);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (npoifs != null) {
try {
npoifs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (pkg != null) {
try {
pkg.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 将文件变成带数据的文件
* @param wb
* @param fileTyle
* @param data 数据
* @param rowNo 从哪行开始写数据
* @param columnNo 从哪列开始写数据
* @param dataHeight 表头的高度
* @param headers 头
*/
public static <T> void file2FileWithData(Workbook wb, ReportFileTypeEnum fileTyle, List<T> data, int rowNo,
int columnNo, int dataHeight,
Object... headers) {
switch (fileTyle) {
case XLS:
file2FileWithDataXls(wb, data, rowNo, columnNo, dataHeight, headers);
break;
case XLSX:
file2FileWithDataXlsx(wb, data, rowNo, columnNo, dataHeight, headers);
break;
default:
throw new RuntimeException();
}
}
// 字符基数,设置为5cm
private final static int WIDTH_BASE = (int) ((5 + 0.72) * 256);
/**
* 通过代码生成模板文件
*
* @param outTemplate
* 模板文件生成之后的地址
* @param dataCount
* 数据大小,用于生成sheet
* @param excelTitle
* 模板文件中的第一行的标题
* @param titleHeight
*