|
@@ -20,11 +20,10 @@ import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
-import java.io.ByteArrayOutputStream;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.OutputStream;
|
|
|
+import java.io.*;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
|
|
|
/**
|
|
|
* @author daiyihua
|
|
@@ -85,24 +84,13 @@ public class ExcelDownloadSrv {
|
|
|
if (data == null || data.isEmpty()) {
|
|
|
throw new AppMessageException("数据为空");
|
|
|
}
|
|
|
- try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
|
|
|
+ try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
|
|
|
// 创建写工作簿对象
|
|
|
WritableWorkbook workbook = Workbook.createWorkbook(out);
|
|
|
// 工作表
|
|
|
WritableSheet sheet = workbook.createSheet(fileName, 0);
|
|
|
- //表头格式
|
|
|
- WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
|
|
|
- //数据行格式
|
|
|
- // 设置背景、字体颜色、对齐方式等等;
|
|
|
- WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
|
|
|
- WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
|
|
|
- //设置文字居中对齐方式;
|
|
|
- cellFormat2.setAlignment(Alignment.CENTRE);
|
|
|
- //设置垂直居中;
|
|
|
- cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
|
|
|
- cellFormat2.setBackground(Colour.WHITE);
|
|
|
- cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
|
|
|
- cellFormat2.setWrap(true);
|
|
|
+ // 获取带样式的cell
|
|
|
+ WritableCellFormat cellFormat = getWritableCellFormat();
|
|
|
//给sheet电子版中所有的列设置默认的列的宽度;
|
|
|
sheet.getSettings().setDefaultColumnWidth(20);
|
|
|
sheet.getSettings().setDefaultRowHeight(30 * 20);
|
|
@@ -130,7 +118,7 @@ public class ExcelDownloadSrv {
|
|
|
sheet.addCell(label);
|
|
|
List<String> colData = data.get(key);
|
|
|
for (int i = 0; i < colData.size(); i++) {
|
|
|
- Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat2);
|
|
|
+ Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat);
|
|
|
sheet.addCell(lb);
|
|
|
}
|
|
|
headerColumn++;
|
|
@@ -159,7 +147,7 @@ public class ExcelDownloadSrv {
|
|
|
if (data == null || data.isEmpty()) {
|
|
|
throw new AppMessageException("数据为空");
|
|
|
}
|
|
|
- try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
|
|
|
+ try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
|
|
|
// 创建写工作簿对象
|
|
|
WritableWorkbook workbook = Workbook.createWorkbook(out);
|
|
|
// 工作表
|
|
@@ -217,7 +205,7 @@ public class ExcelDownloadSrv {
|
|
|
if (data == null || data.isEmpty()) {
|
|
|
throw new AppMessageException("数据为空");
|
|
|
}
|
|
|
- try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
|
|
|
+ try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
|
|
|
// 创建写工作簿对象
|
|
|
WritableWorkbook workbook = Workbook.createWorkbook(out);
|
|
|
// 工作表
|
|
@@ -278,13 +266,13 @@ public class ExcelDownloadSrv {
|
|
|
/**
|
|
|
* 通用的生成 Excel 文件(包含汇总)并以流返回(一点样式也没有)
|
|
|
*
|
|
|
- * @param fileName excel 文件名
|
|
|
- * @param data 需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
|
|
|
+ * @param fileName excel 文件名
|
|
|
+ * @param data 需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
|
|
|
* @throws AppMessageException 业务层异常抛出,如传入数据为空
|
|
|
* @author Walker, added on 06/27/2019.
|
|
|
*/
|
|
|
- public OutputStream generateAndReturnExcelFileWithNoStyleAndCollectLocal(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
|
|
|
- List<ExcelCollectPojo> collectList, int size) throws AppMessageException {
|
|
|
+ public OutputStream generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
|
|
|
+ List<ExcelCollectPojo> collectList, int size) throws AppMessageException {
|
|
|
|
|
|
OutputStream ba = null;
|
|
|
ba = new ByteArrayOutputStream();
|
|
@@ -293,191 +281,87 @@ public class ExcelDownloadSrv {
|
|
|
throw new AppMessageException("数据为空");
|
|
|
}
|
|
|
try {
|
|
|
-// File file = new File(path);
|
|
|
- // 创建写工作簿对象
|
|
|
-// WritableWorkbook workbook = Workbook.createWorkbook(file);
|
|
|
+ // 创建工作表格
|
|
|
workbook = Workbook.createWorkbook(ba);
|
|
|
+ int listSize = 0;
|
|
|
+ if (data.size() > 0) {
|
|
|
+ Set<String> s1 = data.keySet();
|
|
|
+ //开始根据键找值
|
|
|
+ for (String key : s1) {
|
|
|
+ List<String> value = data.get(key);
|
|
|
+ if (!Checker.isNone(value)) {
|
|
|
+ int dataItemSize = value.size();
|
|
|
+ if (listSize < dataItemSize) {
|
|
|
+ listSize = dataItemSize;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- int list = size;
|
|
|
- int a = 0;
|
|
|
- if(list < 60000){
|
|
|
- a = 1;
|
|
|
+ // 单元数
|
|
|
+ int sheetAmount = 0;
|
|
|
+ // 每个单元表格存放最大的行数,当list总数超过每个sheet所设置的最大值时,要注意分成多个sheet来存储
|
|
|
+ int sheetMaxSize = 1;
|
|
|
+ if (listSize < sheetMaxSize) {
|
|
|
+ sheetAmount = 1;
|
|
|
} else {
|
|
|
- if (list % 60000 == 0) {
|
|
|
- a = list / 60000;
|
|
|
+ if (listSize % sheetMaxSize == 0) {
|
|
|
+ sheetAmount = listSize / sheetMaxSize;
|
|
|
} else {
|
|
|
- a = list / 60000 + 1;
|
|
|
+ sheetAmount = listSize / sheetMaxSize + 1;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
// 工作表
|
|
|
- for (int i = 0; i < a; i++) {
|
|
|
- int page = i + 1;
|
|
|
- WritableSheet sheet = workbook.createSheet(fileName + page, 0);
|
|
|
- WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
|
|
|
- //数据行格式
|
|
|
- // 设置背景、字体颜色、对齐方式等等;
|
|
|
- WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
|
|
|
- WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
|
|
|
- //设置文字居中对齐方式;
|
|
|
- cellFormat2.setAlignment(Alignment.CENTRE);
|
|
|
- //设置垂直居中;
|
|
|
- cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
|
|
|
- cellFormat2.setBackground(Colour.WHITE);
|
|
|
- cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
|
|
|
- cellFormat2.setWrap(true);
|
|
|
+ for (int i = 0; i < sheetAmount; i++) {
|
|
|
+ // 当前页数(从0开始)
|
|
|
+ int currentSheetIndex = i;
|
|
|
+ // 当前页数(从1开始)
|
|
|
+ int sheetIndex = currentSheetIndex + 1;
|
|
|
+ WritableSheet sheet = workbook.createSheet(fileName + sheetIndex, currentSheetIndex);
|
|
|
+ // 获取带样式的cell
|
|
|
+ WritableCellFormat cellFormat = getWritableCellFormat();
|
|
|
//给sheet电子版中所有的列设置默认的列的宽度;
|
|
|
sheet.getSettings().setDefaultColumnWidth(20);
|
|
|
sheet.getSettings().setDefaultRowHeight(30 * 20);
|
|
|
+
|
|
|
int firstRow = 0;
|
|
|
//填充表头
|
|
|
int headerColumn = 0;
|
|
|
-// int headerColumn2 = 0;
|
|
|
-// int headerColumn3 = 0;
|
|
|
for (String key : data.keySet()) {
|
|
|
Label label = new Label(headerColumn, firstRow, key, cellFormat);
|
|
|
sheet.addCell(label);
|
|
|
-// Label label2 = new Label(headerColumn2, firstRow, key, cellFormat);
|
|
|
-// sheet2.addCell(label2);
|
|
|
-// Label label3 = new Label(headerColumn3, firstRow, key, cellFormat);
|
|
|
-// sheet3.addCell(label3);
|
|
|
List<String> colData = data.get(key);
|
|
|
- int b = 0;
|
|
|
- int c = i+1;
|
|
|
- if(size < 60000* c){
|
|
|
- b = size - 60000*i;
|
|
|
- } else{
|
|
|
- b = 60000;
|
|
|
+ // 当前页数所对应的行数
|
|
|
+ int currentSheetRowAmount = 0;
|
|
|
+ if (listSize < sheetMaxSize * sheetIndex) {
|
|
|
+ currentSheetRowAmount = listSize - sheetMaxSize * currentSheetIndex;
|
|
|
+ } else {
|
|
|
+ currentSheetRowAmount = sheetMaxSize;
|
|
|
}
|
|
|
- for (int q = 0; q < b; q++) {
|
|
|
- int e = 60000 * i;
|
|
|
+ for (int q = 0; q < currentSheetRowAmount; q++) {
|
|
|
+ int e = sheetMaxSize * currentSheetIndex;
|
|
|
Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(e + q)), cellFormat);
|
|
|
sheet.addCell(lb);
|
|
|
-// sheet2.addCell(lb);
|
|
|
}
|
|
|
-// for (int q = 0; q < 2; q++) {
|
|
|
-// Label lb = new Label(headerColumn2, q + 1, Checker.getStringValue(colData.get(2 + q)), cellFormat);
|
|
|
-// sheet2.addCell(lb);
|
|
|
-// }
|
|
|
-// for (int q = 0; q < 2; q++) {
|
|
|
-// Label lb = new Label(headerColumn3, q + 1, Checker.getStringValue(colData.get(4 + q)), cellFormat);
|
|
|
-// sheet3.addCell(lb);
|
|
|
-// }
|
|
|
headerColumn++;
|
|
|
-// headerColumn2++;
|
|
|
-// headerColumn3++;
|
|
|
}
|
|
|
- if (i == a - 1) {
|
|
|
+ // 最后一页,添加汇总,同时关闭流
|
|
|
+ if (currentSheetIndex == sheetAmount - 1) {
|
|
|
if (!Checker.isNone(collectList)) {
|
|
|
for (ExcelCollectPojo pojo : collectList) {
|
|
|
String[] dataArr = pojo.getDataArr();
|
|
|
for (int r = 0, j = dataArr.length; r < j; r++) {
|
|
|
-// Label lb = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
|
|
|
-// sheet.addCell(lb);
|
|
|
Label lb2 = new Label(pojo.getCol() + r, pojo.getRow(), dataArr[r], cellFormat);
|
|
|
sheet.addCell(lb2);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-// WritableSheet sheet = workbook.createSheet(fileName, 0);
|
|
|
-// WritableSheet sheet2 = workbook.createSheet(fileName + "2", 1);
|
|
|
-// WritableSheet sheet3 = workbook.createSheet(fileName + "3", 2);
|
|
|
-//
|
|
|
-// //表头格式
|
|
|
-// WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
|
|
|
-// //数据行格式
|
|
|
-// // 设置背景、字体颜色、对齐方式等等;
|
|
|
-// WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
|
|
|
-// WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
|
|
|
-// //设置文字居中对齐方式;
|
|
|
-// cellFormat2.setAlignment(Alignment.CENTRE);
|
|
|
-// //设置垂直居中;
|
|
|
-// cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
|
|
|
-// cellFormat2.setBackground(Colour.WHITE);
|
|
|
-// cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
|
|
|
-// cellFormat2.setWrap(true);
|
|
|
-// //给sheet电子版中所有的列设置默认的列的宽度;
|
|
|
-// sheet.getSettings().setDefaultColumnWidth(20);
|
|
|
-// sheet.getSettings().setDefaultRowHeight(30 * 20);
|
|
|
-// sheet2.getSettings().setDefaultColumnWidth(20);
|
|
|
-// sheet2.getSettings().setDefaultRowHeight(30 * 20);
|
|
|
-// sheet3.getSettings().setDefaultColumnWidth(20);
|
|
|
-// sheet3.getSettings().setDefaultRowHeight(30 * 20);
|
|
|
-
|
|
|
-// //单独应用样式
|
|
|
-// if (excelStyleMap != null) {
|
|
|
-// for (String column : excelStyleMap.keySet()) {
|
|
|
-// // 指定列宽
|
|
|
-// int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
|
|
|
-// List<String> columns = new ArrayList<>(data.keySet());
|
|
|
-// for (int i = 0; i <1; i++) {
|
|
|
-// if (columns.get(i).equals(column)) {
|
|
|
-// sheet.setColumnView(i, styleColumnWidth);
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// }
|
|
|
-// }
|
|
|
-// // 设置格式(实线)
|
|
|
-// WritableCellFormat cellFormat = new WritableCellFormat();
|
|
|
-// //给sheet电子版中所有的列设置默认的列的宽度;
|
|
|
-// sheet.getSettings().setDefaultColumnWidth(20);
|
|
|
-// sheet.getSettings().setDefaultRowHeight(35 * 20);
|
|
|
- //行号
|
|
|
-// int firstRow = 0;
|
|
|
-// //填充表头
|
|
|
-// int headerColumn = 0;
|
|
|
-// int headerColumn2 = 0;
|
|
|
-// int headerColumn3 = 0;
|
|
|
-// for (String key : data.keySet()) {
|
|
|
-// Label label = new Label(headerColumn, firstRow, key, cellFormat);
|
|
|
-// sheet.addCell(label);
|
|
|
-// Label label2 = new Label(headerColumn2, firstRow, key, cellFormat);
|
|
|
-// sheet2.addCell(label2);
|
|
|
-// Label label3 = new Label(headerColumn3, firstRow, key, cellFormat);
|
|
|
-// sheet2.addCell(label3);
|
|
|
-// List<String> colData = data.get(key);
|
|
|
-// for (int i = 0; i < 2; i++) {
|
|
|
-// Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat);
|
|
|
-// sheet.addCell(lb);
|
|
|
-//// sheet2.addCell(lb);
|
|
|
-// }
|
|
|
-// for (int q = 0; q < 2; q++) {
|
|
|
-// Label lb = new Label(headerColumn2, q + 1, Checker.getStringValue(colData.get(2 + q)), cellFormat);
|
|
|
-// sheet2.addCell(lb);
|
|
|
-// }
|
|
|
-// for (int q = 0; q < 2; q++) {
|
|
|
-// Label lb = new Label(headerColumn3, q + 1, Checker.getStringValue(colData.get(4 + q)), cellFormat);
|
|
|
-// sheet3.addCell(lb);
|
|
|
-// }
|
|
|
-// headerColumn++;
|
|
|
-// headerColumn2++;
|
|
|
-// headerColumn3++;
|
|
|
-// }
|
|
|
- // 添加汇总
|
|
|
-// if (!Checker.isNone(collectList)) {
|
|
|
-// for (ExcelCollectPojo pojo : collectList) {
|
|
|
-// String[] dataArr = pojo.getDataArr();
|
|
|
-// for (int i = 0, j = dataArr.length; i < j; i++) {
|
|
|
-//// Label lb = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
|
|
|
-//// sheet.addCell(lb);
|
|
|
-// Label lb2 = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
|
|
|
-// sheet2.addCell(lb2);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
- //开始执行写入操作
|
|
|
- if (i == a - 1) {
|
|
|
+ // 写入流
|
|
|
workbook.write();
|
|
|
//关闭流
|
|
|
workbook.close();
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
if (ba != null) {
|
|
|
try {
|
|
|
ba.close();
|
|
@@ -486,7 +370,7 @@ public class ExcelDownloadSrv {
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
- logger.error("ExcelDownloadSrv#generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName={}, path={} ):\n {}",
|
|
|
+ logger.error("ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName={}, path={} ):\n {}",
|
|
|
fileName, path, e.getMessage(), e);
|
|
|
}
|
|
|
return ba;
|
|
@@ -520,15 +404,15 @@ public class ExcelDownloadSrv {
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 通用的生成 Excel 文件(包含汇总)并以流返回(一点样式也没有)
|
|
|
+ * 通用的生成 Excel 字节流(包含汇总)并以流返回(一点样式也没有)
|
|
|
*
|
|
|
- * @param fileName excel 文件名
|
|
|
- * @param data 需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
|
|
|
+ * @param fileName excel 文件名
|
|
|
+ * @param data 需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
|
|
|
* @throws AppMessageException 业务层异常抛出,如传入数据为空
|
|
|
* @author Walker, added on 06/27/2019.
|
|
|
*/
|
|
|
- public OutputStream generateAndReturnMealExcelFileWithNoStyleAndCollectLocal(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
|
|
|
- List<CustomExcelItem> collectList, int size) throws AppMessageException {
|
|
|
+ public OutputStream generateAndReturnExcelByteArrayOutputStreamWithStyle(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
|
|
|
+ List<CustomExcelItem> collectList) throws AppMessageException {
|
|
|
if (data == null || data.isEmpty()) {
|
|
|
throw new AppMessageException("数据为空");
|
|
|
}
|
|
@@ -536,138 +420,99 @@ public class ExcelDownloadSrv {
|
|
|
ba = new ByteArrayOutputStream();
|
|
|
WritableWorkbook workbook = null;
|
|
|
try {
|
|
|
-// File file = new File(path);
|
|
|
+ // 创建工作表格
|
|
|
workbook = Workbook.createWorkbook(ba);
|
|
|
|
|
|
- int list = size;
|
|
|
- int a = 0;
|
|
|
- if(list < 60000){
|
|
|
- a = 1;
|
|
|
+ int listSize = 0;
|
|
|
+ if (data.size() > 0) {
|
|
|
+ Set<String> s1 = data.keySet();
|
|
|
+ //开始根据键找值
|
|
|
+ for (String key : s1) {
|
|
|
+ List<String> value = data.get(key);
|
|
|
+ if (!Checker.isNone(value)) {
|
|
|
+ int dataItemSize = value.size();
|
|
|
+ if (listSize < dataItemSize) {
|
|
|
+ listSize = dataItemSize;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 单元数
|
|
|
+ int sheetAmount = 0;
|
|
|
+ // 每个单元表格存放最大的行数,当list总数超过每个sheet所设置的最大值时,要注意分成多个sheet来存储
|
|
|
+ int sheetMaxSize = 0;
|
|
|
+ if (listSize < sheetMaxSize) {
|
|
|
+ sheetAmount = 1;
|
|
|
} else {
|
|
|
- if (list % 60000 == 0) {
|
|
|
- a = list / 60000;
|
|
|
+ if (listSize % sheetMaxSize == 0) {
|
|
|
+ sheetAmount = listSize / sheetMaxSize;
|
|
|
} else {
|
|
|
- a = list / 60000 + 1;
|
|
|
+ sheetAmount = listSize / sheetMaxSize + 1;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- for (int i = 0; i < a; i++) {
|
|
|
- int page = i + 1;
|
|
|
-
|
|
|
- WritableSheet sheet = workbook.createSheet(fileName + page, 0);
|
|
|
- WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
|
|
|
- //数据行格式
|
|
|
- // 设置背景、字体颜色、对齐方式等等;
|
|
|
- WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
|
|
|
- WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
|
|
|
- //设置文字居中对齐方式;
|
|
|
- cellFormat2.setAlignment(Alignment.CENTRE);
|
|
|
- //设置垂直居中;
|
|
|
- cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
|
|
|
- cellFormat2.setBackground(Colour.WHITE);
|
|
|
- cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
|
|
|
- cellFormat2.setWrap(true);
|
|
|
+ // 工作表
|
|
|
+ for (int i = 0; i < sheetAmount; i++) {
|
|
|
+ // 当前页数(从0开始)
|
|
|
+ int currentSheetIndex = i;
|
|
|
+ // 当前页数(从1开始)
|
|
|
+ int sheetIndex = currentSheetIndex + 1;
|
|
|
+ WritableSheet sheet = workbook.createSheet(fileName + sheetIndex, 0);
|
|
|
+ // 获取带样式的cell
|
|
|
+ WritableCellFormat cellFormat = getWritableCellFormat();
|
|
|
//给sheet电子版中所有的列设置默认的列的宽度;
|
|
|
sheet.getSettings().setDefaultColumnWidth(20);
|
|
|
sheet.getSettings().setDefaultRowHeight(30 * 20);
|
|
|
- int firstRow = 0;
|
|
|
- //填充表头
|
|
|
- int headerColumn = 0;
|
|
|
|
|
|
- int b = 0;
|
|
|
- int c = i+1;
|
|
|
- if(size < 60000* c){
|
|
|
- b = size - 60000*i;
|
|
|
- } else{
|
|
|
- b = 60000;
|
|
|
+ // 单独应用样式
|
|
|
+ if (excelStyleMap != null) {
|
|
|
+ for (String column : excelStyleMap.keySet()) {
|
|
|
+ // 指定列宽
|
|
|
+ int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
|
|
|
+ List<String> columns = new ArrayList<>(data.keySet());
|
|
|
+ for (int j = 0, columnsSize = columns.size(); j < columnsSize; j++) {
|
|
|
+ if (columns.get(j).equals(column)) {
|
|
|
+ sheet.setColumnView(j, styleColumnWidth);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+ // 第一行
|
|
|
+ int firstRow = 0;
|
|
|
+ // 填充表头
|
|
|
+ int headerColumn = 0;
|
|
|
+ // 遍历设置数据
|
|
|
for (String key : data.keySet()) {
|
|
|
Label label = new Label(headerColumn, firstRow, key, cellFormat);
|
|
|
sheet.addCell(label);
|
|
|
List<String> colData = data.get(key);
|
|
|
- for (int q = 0; q < b; q++) {
|
|
|
- int e = 60000 * i;
|
|
|
- Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(e + q)), cellFormat);
|
|
|
+ // 当前页数所对应的行数
|
|
|
+ int currentSheetRowAmount = 0;
|
|
|
+ if (listSize < sheetMaxSize * sheetIndex) {
|
|
|
+ currentSheetRowAmount = listSize - sheetMaxSize * currentSheetIndex;
|
|
|
+ } else {
|
|
|
+ currentSheetRowAmount = sheetMaxSize;
|
|
|
+ }
|
|
|
+ for (int q = 0; q < currentSheetRowAmount; q++) {
|
|
|
+ // 之前所有页的数据汇总数量
|
|
|
+ int beforePageAllAmount = sheetMaxSize * currentSheetIndex;
|
|
|
+ Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(beforePageAllAmount + q)), cellFormat);
|
|
|
sheet.addCell(lb);
|
|
|
}
|
|
|
headerColumn++;
|
|
|
}
|
|
|
- // 添加汇总
|
|
|
- if (i == a - 1) {
|
|
|
+ // 最后一页,添加汇总,同时关闭流
|
|
|
+ if (currentSheetIndex == sheetAmount - 1) {
|
|
|
if (!Checker.isNone(collectList)) {
|
|
|
for (CustomExcelItem item : collectList) {
|
|
|
- sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(),
|
|
|
- item.getCellFormat() == null ? cellFormat2 : item.getCellFormat()));
|
|
|
-
|
|
|
-
|
|
|
+ sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(), item.getCellFormat() == null ? cellFormat : item.getCellFormat()));
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (i == a - 1){
|
|
|
+ // 写入流
|
|
|
workbook.write();
|
|
|
- //关闭流
|
|
|
+ // 关闭流
|
|
|
workbook.close();
|
|
|
}
|
|
|
}
|
|
|
-// // 工作表
|
|
|
-// WritableSheet sheet = workbook.createSheet(fileName, 0);
|
|
|
-// //表头格式
|
|
|
-// WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
|
|
|
-// //数据行格式
|
|
|
-// // 设置背景、字体颜色、对齐方式等等;
|
|
|
-// WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
|
|
|
-// WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
|
|
|
-// //设置文字居中对齐方式;
|
|
|
-// cellFormat2.setAlignment(Alignment.CENTRE);
|
|
|
-// //设置垂直居中;
|
|
|
-// cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
|
|
|
-// cellFormat2.setBackground(Colour.WHITE);
|
|
|
-// cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
|
|
|
-// cellFormat2.setWrap(true);
|
|
|
-// //给sheet电子版中所有的列设置默认的列的宽度;
|
|
|
-// sheet.getSettings().setDefaultColumnWidth(20);
|
|
|
-// sheet.getSettings().setDefaultRowHeight(30 * 20);
|
|
|
- //单独应用样式
|
|
|
-// if (excelStyleMap != null) {
|
|
|
-// for (String column : excelStyleMap.keySet()) {
|
|
|
-// // 指定列宽
|
|
|
-// int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
|
|
|
-// List<String> columns = new ArrayList<>(data.keySet());
|
|
|
-// for (int i = 0; i < columns.size(); i++) {
|
|
|
-// if (columns.get(i).equals(column)) {
|
|
|
-// sheet.setColumnView(i, styleColumnWidth);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
- //行号
|
|
|
-// int firstRow = 0;
|
|
|
-// //填充表头
|
|
|
-// int headerColumn = 0;
|
|
|
-// for (String key : data.keySet()) {
|
|
|
-// Label label = new Label(headerColumn, firstRow, key, cellFormat);
|
|
|
-// sheet.addCell(label);
|
|
|
-// List<String> colData = data.get(key);
|
|
|
-// for (int i = 0; i < colData.size(); i++) {
|
|
|
-// Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat2);
|
|
|
-// sheet.addCell(lb);
|
|
|
-// }
|
|
|
-// headerColumn++;
|
|
|
-// }
|
|
|
-// // 添加汇总
|
|
|
-// if (!Checker.isNone(collectList)) {
|
|
|
-// for (CustomExcelItem item : collectList) {
|
|
|
-// sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(),
|
|
|
-// item.getCellFormat() == null ? cellFormat2 : item.getCellFormat()));
|
|
|
-//
|
|
|
-// }
|
|
|
-// }
|
|
|
- //开始执行写入操作
|
|
|
-
|
|
|
-
|
|
|
if (ba != null) {
|
|
|
try {
|
|
|
ba.close();
|
|
@@ -676,9 +521,44 @@ public class ExcelDownloadSrv {
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
- logger.error("ExcelDownloadSrv#generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName={}, path={} ):\n {}",
|
|
|
+ logger.error("ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName={}, path={} ):\n {}",
|
|
|
fileName, path, e.getMessage(), e);
|
|
|
}
|
|
|
return ba;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * OutputStream 转化成 File
|
|
|
+ * @param localPath 对应本地文件路径
|
|
|
+ * @param ba 文件流 {@link OutputStream}
|
|
|
+ */
|
|
|
+ public void outputStreamToFile(String localPath, OutputStream ba) {
|
|
|
+
|
|
|
+ File file = new File(localPath);
|
|
|
+ //选择流
|
|
|
+ FileOutputStream fos = null;
|
|
|
+ ByteArrayInputStream bais = null;
|
|
|
+ try {
|
|
|
+ bais = new ByteArrayInputStream(((ByteArrayOutputStream) ba).toByteArray());
|
|
|
+ fos = new FileOutputStream(file);
|
|
|
+ int temp;
|
|
|
+ byte[] bt = new byte[1024 * 10];
|
|
|
+ while ((temp = bais.read(bt)) != -1) {
|
|
|
+ fos.write(bt, 0, temp);
|
|
|
+ }
|
|
|
+ } catch (FileNotFoundException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ //关流
|
|
|
+ try {
|
|
|
+ if (null != fos) {
|
|
|
+ fos.close();
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|