poi读取excel多层表头模板写入数据并导出
这两天刚好写excel,写了一份自定义表头的,写了一份模板的,这里展示一份读取excel模板写入数据并导出的
//title excel的名称 headers看下面一段代码,根据这个读取list数据然后写入excel,不是创建的excel表头,东西一样。exportDatas list数据
public void exportExcel(String title, HttpServletRequest req, HttpServletResponse resp, List<String> headers, List<Map<String, Object>> exportDatas) throws IOException {
// 读取源文件,模板数据存放位置
FileInputStream inp= new FileInputStream("地址");
//得这么写,不然写不入数据,下面照抄也行
XSSFWorkbook wb = new XSSFWorkbook(inp);
SXSSFWorkbook swb = new SXSSFWorkbook(wb,2);
XSSFWorkbook xssfWorkbook = swb.getXSSFWorkbook();
XSSFSheet sh = xssfWorkbook.getSheetAt(0);
/**
* 设置列值
*/
int rows = 2;
for (Map<String, Object> data : exportDatas) {
Row row = sh.createRow(rows++);
//单元格高宽,这句话用在无模板的时候,有模板加这句,会有很多空白列出现
//sh.setColumnWidth(row.getRowNum(), (int) (title.getBytes().length * 1.2d * 256 > 12 * 256 ? title.getBytes().length * 1.2d * 256 : 22 * 256));
int initCellNo = 0;
int titleSize = headers.size();
//根据名称从list中读取数据然后写入excel
for (int i = 0; i < titleSize; i++) {
String key = headers.get(i);
Object object = data.get(key);
if (object == null) {
row.createCell(initCellNo).setCellValue("");
} else {
row.createCell(initCellNo).setCellValue(String.valueOf(object));
}
initCellNo++;
}
}
String fileName = title + ".xlsx";
resp.setContentType("text/html;charset=utf-8");
resp.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
ServletOutputStream out = resp.getOutputStream();
wb.write(out);
out.close();
}
为了不泄露数据,随便写几个,可以根据headers从list中读取出需要的数据写入到对的位置
public List<String> getHeaders() {
List<String> headers = new ArrayList<>();
headers.add("ID");
headers.add("ID2");
headers.add("ID3");
headers.add("ID4");
headers.add("ID5");
headers.add("ID6");
return headers;
}
导出的数据如下,这种就可以简单的创建双层表头三层表头啥的,我这需要双层表头所以改成了模板,本来是动态生成表头,不用读取模板
Font headFont = wb.createFont();
headFont.setFontName("宋体");
headFont.setColor(HSSFColor.WHITE.index);
headFont.setFontHeightInPoints((short) 10);// 字体大小
headFont.setBold(true);// 加粗
// 设置普通单元格字体
Font font = wb.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 9);
// 设置普通单元格样式
CellStyle style = wb.createCellStyle();
style.setFont(font);
style.setAlignment(HorizontalAlignment.CENTER);// 左右居中
style.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中
style.setWrapText(true);
style.setLeftBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(BorderStyle.NONE);
style.setRightBorderColor(HSSFColor.BLACK.index);
style.setBorderRight(BorderStyle.NONE);
style.setBorderBottom(BorderStyle.MEDIUM); // 设置单元格的边框为粗体
style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色.
style.setFillForegroundColor(HSSFColor.WHITE.index);// 设置单元格的背景颜色.
//设置单位格样式为文本
DataFormat dataFormat = wb.createDataFormat();
style.setDataFormat(dataFormat.getFormat("@"));
这个可用于无模板时设置创建的excel格式
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
pom文件