先了解下excel,什么是excel就不用介绍了,这里主要说明不同版本下每个sheet下的行列限制。
所以就需要导出xlsx文件。如果使用xls则会报错
IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
其实也不是多么高深的处理
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
Sheet sheet = sxssfWorkbook.createSheet("Sheet1");
SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。说一些官方话可能没啥用,直接上代码。
void exportExcel(List<Map<String, Object>> list, String[] lables, String[] fields, String fileName);
方法需要的参数:数据集合list,其中map
的key
与filelds
一一对应,filelds
与lables
一一对应。
具体看下代码:
List<Map<String,Object>> list = new ArrayList<>();
for(OrderMaterialMultiTemplate orderMaterialMultiTemplate :resultList){
Map<String,Object> map = new HashMap<>();
map.put("materialCode",orderMaterialMultiTemplate.getMaterialCode());
map.put("categoryCode",orderMaterialMultiTemplate.getCategoryCode());
map.put("materialName",orderMaterialMultiTemplate.getMaterialName());
map.put("materialSpecification",orderMaterialMultiTemplate.getMaterialSpecification());
list.add(map);
}
ExportExcel exportExcel = new ExportExcelImpl();//下面有这个文件的详细带啊吗
String[] lables = new String[]{"物料编码","物料分类编码","物料名称","物料规格"};//表头数组
String[] fields = new String[]{"materialCode", "categoryCode","materialName", "materialSpecification"};//查询数据对应的属性数组
exportExcel.exportExcel(list,lables,fields,"路径+文件名称.xlsx");//下方方法
ExportExcelImpl
public void exportExcel(List<Map<String, Object>> list,String[] lables,String[] fields,String fileName) {
System.out.println("开始写入"+new Date());
OutputStream os = null;
SXSSFWorkbook sxssfWorkbook = null;
try {
// 获取SXSSFWorkbook
sxssfWorkbook = new SXSSFWorkbook();
Sheet sheet = sxssfWorkbook.createSheet("Sheet1");
// 冻结第一行,下拉滚动条时,第一行始终在上面
sheet.createFreezePane(0, 1);
// 创建第一行,作为header表头
Row header = sheet.createRow(0);
// 循环创建header单元格
for (int cellnum = 0; cellnum < lables.length; cellnum++) {
Cell cell = header.createCell(cellnum);
//cell.setCellStyle(getAndSetXSSFCellStyleHeader(sxssfWorkbook));//设置表头单元格样式,根据需要设置
cell.setCellValue(lables[cellnum]);
//设置每列固定宽度
sheet.setColumnWidth(cellnum, 21 * 260);
}
// 遍历创建行,导出数据
for (int rownum = 1; rownum <= list.size(); rownum++) {
Row row = sheet.createRow(rownum);
Map<String, Object> map = list.get(rownum-1);
// 循环创建单元格
for (int cellnum = 0; cellnum < fields.length; cellnum++) {
Cell cell = row.createCell(cellnum);
//cell.setCellStyle(getAndSetXSSFCellStyleOne(sxssfWorkbook));//设置数据行单元格样式,根据需要设置
//塞值
cell.setCellValue(map.get(fields[cellnum]) == null ? "" : map.get(fields[cellnum]).toString());
}
}
//自定义各列宽度
//setSheet(sheet);
//声明文件
File file = new File(fileName);
File pFile = file.getParentFile();
if (!pFile.exists()) {
//生成文件
pFile.mkdirs();
}
if(!file.exists()){
//清除文件内容
file.createNewFile();
}
os = new FileOutputStream(fileName);
//写入文件
sxssfWorkbook.write(os);
System.out.println("结束写入"+new Date());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(sxssfWorkbook != null) {
//处理SXSSFWorkbook导出excel时,产生的临时文件
sxssfWorkbook.dispose();
}
if(os != null) {
//关闭流
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这就可以了可以直接复制拿去用,试一试,看到这里也为有缘
,相信也看过其他的博客,动手试一试,不动手是没办法成功的
。
另外方法中注释了两行代码是关于设置样式的,你可以自己设置,常用的我在这里列一下:
//声明样式
CellStyle style = sxssfWorkbook.createCellStyle();
//背景色
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
//自动换行
style.setWrapText(true);
//居中
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
//边框
style.setBorderTop(BorderStyle.THIN);// 上边框
style.setBorderLeft(BorderStyle.THIN);// 左边框
style.setBorderRight(BorderStyle.THIN);// 右边框
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
//给单元格赋样式
cell.setCellStyle(style);