背景:项目中用到邮件发送功能,需要将数据导入excel表格然后发送给供应商,第一次做的时候是直接创建了一个excel,领导说比较丑,就找甲方要了个模板,所以本篇文章除了介绍直接生成excel导入数据的功能以外,也介绍按照固定模板的方式导入数据的功能。
1.新生成一个Excel,并将数据导入
package com.tdhc.common.util;
import com.tdhc.common.model.PuEnquiry;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.util.List;
/**
* 将对象转换为excel表格,并转化为字节输出流返回
*/
public class CreateExcel {
public static ByteArrayOutputStream CreateExccel(List<PuEnquiry> list){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//创建一个工作薄对象
Workbook workbook = new XSSFWorkbook();
// 创建一个表
XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1");
//创建首行
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("询价单号");
row.createCell(1).setCellValue("请购单号");
row.createCell(2).setCellValue("物资名称");
row.createCell(3).setCellValue("规格型号");
row.createCell(4).setCellValue("单位");
row.createCell(5).setCellValue("申报量");
row.createCell(6).setCellValue("单价");
row.createCell(7).setCellValue("备货日期");
row.createCell(8).setCellValue("货物信息/图片");
row.createCell(9).setCellValue("有效日期");
row.createCell(10).setCellValue("供应商名称");
row.createCell(11).setCellValue("公司简称");
row.createCell(12).setCellValue("电邮地址");
row.createCell(13).setCellValue("联系人");
row.createCell(14).setCellValue("联系电话");
for(int i=1;i<list.size();i++) {
XSSFRow row1 = sheet.createRow(i);
row1.createCell(0).setCellValue(list.get(i-1).getEnquirynum());
row1.createCell(1).setCellValue(list.get(i-1).getDocumentcode());
row1.createCell(2).setCellValue(list.get(i-1).getMatname());
row1.createCell(3).setCellValue(list.get(i-1).getSpecification());
row1.createCell(4).setCellValue(list.get(i-1).getUnit());
row1.createCell(5).setCellValue(list.get(i-1).getDeclarequantity());
row1.createCell(6).setCellValue(list.get(i-1).getUnitprice());
row1.createCell(7).setCellValue(list.get(i-1).getReadydate());
row1.createCell(8).setCellValue(list.get(i-1).getCargoinfo());
row1.createCell(9).setCellValue(list.get(i-1).getEffectivedate());
row1.createCell(10).setCellValue(list.get(i-1).getSupname());
row1.createCell(11).setCellValue(list.get(i-1).getSupshortname());
row1.createCell(12).setCellValue(list.get(i-1).getSupemail());
row1.createCell(13).setCellValue(list.get(i-1).getSuplinkman());
row1.createCell(14).setCellValue(list.get(i-1).getSuplinkmanphone());
}
try {
workbook.write(baos);
baos.close();
}catch (Exception e){
e.printStackTrace();
}
return baos;
}
}
步骤:创建工作薄–创建表–创建行–创建单元格–操作单元格
备注:不用管方法的返回值及工作流,因为我是为了配合邮件发送excel附件才那么做的,只用关注创建工作簿到setCellValue就可以了。
2.按照固定excel模板导入数据
package com.tdhc.common.util;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.examples.CreateCell;
import java.io.*;
import java.util.List;
public class CreateExcelAsTemp {
public static ByteArrayOutputStream CreateExcel(List<Person> list) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 读取源文件
FileInputStream fis = new FileInputStream("F:/test.xlsx");
XSSFWorkbook workBook = new XSSFWorkbook(fis);
// 进行模板的克隆(接下来的操作都是针对克隆后的sheet)
XSSFSheet sheet = workBook.cloneSheet(0);
workBook.setSheetName(1, "询价单"); // 给sheet命名
workBook.removeSheetAt(0);
XSSFCellStyle cellStyle = workBook.createCellStyle();
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());//底框黑色
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边黑色
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边黑色
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右边黑色
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 字体居中
for (int i=10;i<list.size()+10;i++){
Row row = sheet.createRow(i);
Cell cell = row.createCell(0);
cell.setCellStyle(cellStyle);
cell.setCellValue(i-9);
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle);
cell1.setCellValue((list.get(i-10).getName()));
Cell cell2 = row.createCell(2);
cell2.setCellStyle(cellStyle);
cell2.setCellValue(list.get(i-10).getAge());
Cell cell3 = row.createCell(3);
cell3.setCellStyle(cellStyle);
cell3.setCellValue(list.get(i-10).getAddress());
Cell cell4 = row.createCell(4);
cell4.setCellStyle(cellStyle);
cell4.setCellValue(list.get(i-10).getBirthday());
Cell cell5 = row.createCell(5);
cell5.setCellStyle(cellStyle);
cell5.setCellValue(list.get(i-10).getBirthday());
Cell cell6 = row.createCell(6);
cell6.setCellStyle(cellStyle);
cell6.setCellValue(list.get(i-10).getAaa());
Cell cell7 = row.createCell(7);
cell7.setCellStyle(cellStyle);
cell7.setCellValue(list.get(i-10).getBbb());
Cell cell8 = row.createCell(8);
cell8.setCellStyle(cellStyle);
cell8.setCellValue(list.get(i-10).getCcc());
Cell cell9 = row.createCell(9);
cell9.setCellStyle(cellStyle);
cell9.setCellValue(list.get(i-10).getDdd());
}
try {
workBook.write(baos);
baos.close();
/*FileOutputStream fileOutputStream = new FileOutputStream("F:/aaa.xlsx");
workBook.write(fileOutputStream);
fileOutputStream.close();*/
}catch (Exception e){
e.printStackTrace();
}
return baos;
}
}
步骤: 从磁盘中读取源文件–根据源文件克隆sheet–操作(之后的类似于第一种操作,多了设置样式的代码是因为我要跟模板对应上,而且setCellValue和SetCellStyle不能同时写在一行,所以后边的而代码看起来比较多)
备注: 克隆完之后的操作类似于第一种操作,这里使用的是克隆的方式,当然也可以使用POI读取之类的方式,达成效果即可。
关于参考的操作单元格的技术博客:
https://www.cnblogs.com/jym-sunshine/p/4917476.html
https://www.cnblogs.com/yanjie-java/p/8329276.html
这两个是对于我来说比较有用的,当然也有其他大佬的博客同样优秀,例子很多,有关的功能可以搜索一下作为参考