读取Excel模板写入内容,并继续使用Java生成Excel表格

Java中可以用代码生成Excel,但是针对比较复杂的Excel用代码生成就会比较麻烦,这就适合使用Excel模板和代码生成两种方式在一起使用。

举例:现在要生成如下的Excel

读取Excel模板写入内容,并继续使用Java生成Excel表格

实现方式:第一个表格和第二个表格表头使用模板,第二个表格内容和第三个表格使用代码动态生成

代码如下:

//jsonObject 是前台传入的Excel表格内需要的数据

public static String exportBaseLineDataExcel(HttpServletRequest request, HttpServletResponse response,
JSONObject jsonObject){
JSONObject resultJson = new JSONObject();
try {
request.setCharacterEncoding("UTF-8");
String fileName = "基线信息报表-" ;
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
// 1.读取已有的基线模板
String ret =  "D:\\file\\BaselineInfo.xls";//Excel模板地址
FileInputStream fis = new FileInputStream(ret);
POIFSFileSystem ps = new POIFSFileSystem(fis);
HSSFWorkbook workbook = new HSSFWorkbook(ps);//这里使用的Excel2003,要注意Excel版本
HSSFSheet hssfSheet = workbook.getSheetAt(0);
// 3.向基线模板中一行一行写入信息
HSSFRow row = hssfSheet.getRow(1);
Cell cell = row.getCell(2);//合并的单元格取第一个cell的位置对象
cell.setCellValue("飞机基线信息");
row = hssfSheet.getRow(2);
cell = row.getCell(2);
cell.setCellValue(“11”);// 型代号
cell = row.getCell(7);
cell.setCellValue(jsonObject.getString("type"));// 基线类型
row = hssfSheet.getRow(3);
cell = row.getCell(2);
cell.setCellValue(jsonObject.getString("number"));// 基线编号
cell = row.getCell(7);
cell.setCellValue(jsonObject.getString("name"));// 基线名称
row = hssfSheet.getRow(4);
cell = row.getCell(2);
cell.setCellValue(jsonObject.getString("relatedBER"));// 基线创建申请单编号
cell = row.getCell(7);
cell.setCellValue(jsonObject.getString("relatedBCR"));// 基线更改申请单编号


// 向构型文件清单中写入数据
JSONArray jsonDocArray = jsonObject.getJSONArray("docDataList");// 文件清单内容
int newRow = hssfSheet.getLastRowNum() + 1;//和上一个表格中间隔一行
CellStyle cellStyle = workbook.createCellStyle();//增加表格样式,边框线,水平居中
cellStyle.setBorderBottom(CellStyle.BORDER_THIN);// 边框线
cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
cellStyle.setBorderRight(CellStyle.BORDER_THIN);
cellStyle.setBorderTop(CellStyle.BORDER_THIN);
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);// 水平居中
for (int i = 0; i < jsonDocArray.size(); i++) {
JSONObject jsonContent = jsonDocArray.getJSONObject(i);
row = hssfSheet.createRow(newRow + i);
row.createCell(1).setCellValue(i + 1);// 序号
hssfSheet.addMergedRegion(new CellRangeAddress(newRow + i, newRow + i, 2, 5));//合并单元格
row.createCell(2).setCellValue(jsonContent.getString("number"));// 文件/图样编号
row.createCell(3);//345不创建的话会没有边框线
row.createCell(4);
row.createCell(5);
row.createCell(6).setCellValue(jsonContent.getString("version"));// 版本
hssfSheet.addMergedRegion(new CellRangeAddress(newRow + i, newRow + i, 7, 10));
row.createCell(7).setCellValue(jsonContent.getString("name"));// 文件图样名称
row.createCell(8);
row.createCell(9);
row.createCell(10);
for (Cell singleCell : row) {
singleCell.setCellStyle(cellStyle);
}
}
// 详细信息表格
int startRow = hssfSheet.getLastRowNum() + 2;// 和上一个表格中间空一行
// 建表头
HSSFRow hssfRow = hssfSheet.createRow(startRow);
hssfRow.createCell(1).setCellValue(“层级”);
hssfSheet.addMergedRegion(new CellRangeAddress(startRow, startRow, 2, 3));
hssfRow.createCell(2).setCellValue(“编号”);
hssfRow.createCell(3);
hssfSheet.addMergedRegion(new CellRangeAddress(startRow, startRow, 4, 5));
hssfRow.createCell(4).setCellValue(“名称”);
hssfRow.createCell(5);
hssfRow.createCell(6).setCellValue(“版本”);
hssfRow.createCell(7).setCellValue(数量);
hssfRow.createCell(8).setCellValue(“下一级装配件”);
hssfRow.createCell(9).setCellValue(“对称标识”);
hssfRow.createCell(10).setCellValue(“零件类型”);
for (Cell orCell : hssfRow) {
orCell.setCellStyle(cellStyle);
}
// 循环写入数据(根据模块编号查询其下级装配件信息)
for (int i = 0; i < jsonDocArray.size(); i++) {
JSONObject nextLevelJson = jsonDocArray.getJSONObject(i);
String fileNum = nextLevelJson.getString("number");// 编号
String name = nextLevelJson.getString("name");// 名称
String version = nextLevelJson.getString("version");
int contentRow = startRow + i + 1;//第三个表格内容的起始行

// 根据模块编号查询下级装配信息(此处就是查询出下级装配的所有信息并循环写入,循环我没写只写了循环体)  

hssfRow = hssfSheet.createRow(contentRow);
hssfRow.createCell(1).setCellValue("1.1");// 层级
hssfSheet.addMergedRegion(new CellRangeAddress(contentRow, contentRow, 2, 3));
hssfRow.createCell(2).setCellValue(fileNum);// 编号
hssfRow.createCell(3);
hssfSheet.addMergedRegion(new CellRangeAddress(contentRow, contentRow, 4, 5));
hssfRow.createCell(4).setCellValue(name);
hssfRow.createCell(5);
hssfRow.createCell(6).setCellValue(version);// 版本
hssfRow.createCell(7).setCellValue("22");// 数量
hssfRow.createCell(8).setCellValue("N/A");// 下一级装配件
hssfRow.createCell(9).setCellValue("ss");// 对称标识
hssfRow.createCell(10).setCellValue("dd");// 零件标识
for (Cell orCell : hssfRow) {
orCell.setCellStyle(cellStyle);
}
}

OutputStream out = response.getOutputStream();
workbook.write(out);
out.close();
workbook.close();
resultJson.put("result", "success");
} catch (Exception e) {
resultJson.put("result", "fail");
resultJson.put("msg", e.getMessage());
e.printStackTrace();
}
return resultJson.toString();

}

以上就基本是所有的代码,测试的时候可以使用FileOutputStream out = new FileOutputStream (“D:\\file\\test.xls”)把Excel生成到本地测试