}
sign.append("#").append(exportTable.getStyle());
// 数据量超过百万或者数据为空,只返回有表头得单元格
if(rowCount==0 || rowCount*fields.size() >= ROW_SIZE*1500){
EasyExcel.write(outputStream)
// 这里放入动态头
.head(head).sheet("数据")
// 传入表头样式
.registerWriteHandler(EasyExcelUtils.getStyleStrategy())
// 当然这里数据也可以用 List> 去传入
.doWrite(new LinkedList<>());
byte[] bytes = outputStream.toByteArray();
// 上传文件到FastDFS 返回上传路径
return fastWrapper.uploadFile(bytes, bytes.length, "xlsx") + "?filename=" + fileName + ".xlsx";
}
sign.append("#").append(rowCount);
String fieldSign = fields.stream().sorted(Comparator.comparing(ExportTable.ExportColumn::getId))
.map(e->e.getId()).collect(Collectors.joining(","));
sign.append("#").append(fieldSign);
/**
* 相同的下载文件请求 直接返回
* the redis combines with datasetId - filter - size of data - fields
*/
if (redisClientImpl.hasKey(sign.toString())){
return redisClientImpl.get(sign.toString()).toString();
}
/**
* 分sheet页
* divide into sheets with 10M data per sheet
*/
int sheetCount = (rowCount/ (ROW_SIZE*ROW_PAGE))+1;
String[] paths = new String[sheetCount];
ByteArrayInputStream[] ins = new ByteArrayInputStream[sheetCount];
CountDownLatch threadSignal = new CountDownLatch(sheetCount);
for(int i=0;i int finalI = i;
String finalTable = table;
Datasource finalDs = ds;
String finalOrder = order;
int finalRowCount = rowCount;
threadExecutor.submit(()->{
// excel文件流
ByteArrayOutputStream singleOutputStream = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel.write(singleOutputStream).build();
// 单sheet页写入数
int sheetThreadCount = finalI == (sheetCount-1) ? (finalRowCount - finalI *(ROW_SIZE*ROW_PAGE))/ROW_SIZE+1 : ROW_PAGE;
CountDownLatch sheetThreadSignal = new CountDownLatch(sheetThreadCount);
for(int j=0;j int page = finalI *ROW_PAGE + j + 1;
// 最后一页数据
int pageSize = j==(sheetThreadCount-1)&& finalI ==(sheetCount-1) ? finalRowCount %ROW_SIZE : ROW_SIZE;
threadExecutor.submit(()->{
try {
writeExcel(dataSetTableRequest, datasetTable, finalTable, qp,
datasetTableFields, exportTable, page, pageSize, finalDs, datasourceProvider,
fieldArray, fields, head, map, headRow, excelWriter, mergeIndex, finalOrder);
sheetThreadSignal.countDown();
} catch (Exception e) {
e.printStackTrace();
}
});
}
try {
sheetThreadSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭写入流
excelWriter.finish();
paths[finalI] = (finalI +1) + "-" + fileName + ".xlsx";
// 单文件
if (sheetCount == 1){
// xlsx
// 将sign存入redis并设置过期时间
}
threadSignal.countDown();
});
}
threadSignal.await();
if (sheetCount != 1){
ZipUtil.zip(outputStream, paths, ins);
byte[] bytes = outputStream.toByteArray();
// 上传文件到FastDFS 返回上传路径
path.append(fastWrapper.uploadFile(bytes, bytes.length, "zip"))
.append("?filename=").append(fileName).append(".zip");
// 将sign存入redis并设置过期时间
redisClientImpl.set(sign.toString(), path.toString(), SYS_REDIS_EXPIRE_TIME);
}
} catch (Exception e) {
e.printStackTrace();
}
return path.toString();
}
private void writeExcel(ExcelWriter excelWriter){
//数据查询
// todo
synchronized (excelWriter) {
WriteSheet writeSheet = EasyExcel.writerSheet(0, "第" + 1 + "页数据")
// 这里放入动态头
.head(head)
//传入样式
.registerWriteHandler(EasyExcelUtils.getStyleStrategy())
.registerWriteHandler(new CellColorSheetWriteHandler(map, headRow))
.registerWriteHandler(new MergeStrategy(lists.size(), mergeIndex))
// 当然这里数据也可以用 List> 去传入
.build();
excelWriter.write(lists, writeSheet);
}
}
Excel导出的文件流样式处理类 。
CellColorSheetWriteHandler.java
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.StyleUtil;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
推荐阅读
- 海运dhc是什么费用……dhc公铁好用吗?
- 免洗发膜哪个牌子好用 什么发膜好用
- 竞价点击器哪个好用。请问百度竞价点击器在哪里能找到
- 最好用的电脑手写板 手写板软件
- 鱼子酱发膜真的有用吗?十大最好用发膜排行榜?
- 好用的润唇膏 小蜜缇润唇膏
- 露华浓洗发水好用吗 露华浓生姜
- 花印怎么样好用吗 花印怎么样
- BT搜索蜘蛛 bt磁力搜索
- 娇韵诗哪个水好用 娇韵诗防晒霜
