|
@@ -22,7 +22,10 @@ import org.apache.poi.hssf.util.HSSFColor;
|
|
import org.apache.poi.ss.usermodel.*;
|
|
import org.apache.poi.ss.usermodel.*;
|
|
import org.apache.poi.ss.util.CellRangeAddress;
|
|
import org.apache.poi.ss.util.CellRangeAddress;
|
|
import org.apache.poi.ss.util.RegionUtil;
|
|
import org.apache.poi.ss.util.RegionUtil;
|
|
|
|
+import org.apache.poi.xssf.streaming.SXSSFRow;
|
|
|
|
+import org.apache.poi.xssf.streaming.SXSSFSheet;
|
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFRow;
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
@@ -31,6 +34,7 @@ import javax.servlet.ServletOutputStream;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.io.*;
|
|
import java.io.*;
|
|
|
|
+import java.lang.reflect.Field;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.net.URLEncoder;
|
|
import java.net.URLEncoder;
|
|
import java.sql.Timestamp;
|
|
import java.sql.Timestamp;
|
|
@@ -69,6 +73,12 @@ public class ExcelExport {
|
|
private String exportFileName;
|
|
private String exportFileName;
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
+ * 缓冲大小,SXSSFWorkbook每次的缓冲数量
|
|
|
|
+ * 达到了就写进磁盘
|
|
|
|
+ */
|
|
|
|
+ private int bufferSize = 3000;
|
|
|
|
+
|
|
|
|
+ /**
|
|
* 日志
|
|
* 日志
|
|
*/
|
|
*/
|
|
private Log logger = LogFactory.getLog(ExcelExport.class);
|
|
private Log logger = LogFactory.getLog(ExcelExport.class);
|
|
@@ -104,7 +114,7 @@ public class ExcelExport {
|
|
} else if (exportFileName.endsWith(ExcelExport.EXCEL07_EXTENSION)) {
|
|
} else if (exportFileName.endsWith(ExcelExport.EXCEL07_EXTENSION)) {
|
|
workBook = new XSSFWorkbook();
|
|
workBook = new XSSFWorkbook();
|
|
} else {
|
|
} else {
|
|
- workBook = new SXSSFWorkbook(3000);
|
|
|
|
|
|
+ workBook = new SXSSFWorkbook(bufferSize);
|
|
fileName += ".xlsx";
|
|
fileName += ".xlsx";
|
|
// 按正则替换? 处理文件名最后一个字符为“.” 的问题
|
|
// 按正则替换? 处理文件名最后一个字符为“.” 的问题
|
|
// fileName = fileName.replaceAll("..", ".");
|
|
// fileName = fileName.replaceAll("..", ".");
|
|
@@ -590,17 +600,11 @@ public class ExcelExport {
|
|
int[] cellWidth = new int[cols];
|
|
int[] cellWidth = new int[cols];
|
|
|
|
|
|
// 取列中最长的行
|
|
// 取列中最长的行
|
|
- for (int col = 0; col < cols; col++) {
|
|
|
|
- for (int row = 0; row < rows; row++) {
|
|
|
|
- Cell cell = sheet.getRow(row).getCell(col);
|
|
|
|
- String value = getCellValue(cell);
|
|
|
|
- int length = value.getBytes().length;
|
|
|
|
- if (length > cellWidth[col]) {
|
|
|
|
- cellWidth[col] = length;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if (sheet instanceof SXSSFSheet) {
|
|
|
|
+ findColMaxRowLength(cellWidth, rows, ((SXSSFSheet) sheet).getLastFlushedRowNum() + 1, sheet);
|
|
|
|
+ } else {
|
|
|
|
+ findColMaxRowLength(cellWidth, rows, 0, sheet);
|
|
}
|
|
}
|
|
-
|
|
|
|
for (int j = 0; j < cellWidth.length; j++) {
|
|
for (int j = 0; j < cellWidth.length; j++) {
|
|
if (cellWidth[j] > 254) {
|
|
if (cellWidth[j] > 254) {
|
|
cellWidth[j] = 254;
|
|
cellWidth[j] = 254;
|
|
@@ -614,6 +618,26 @@ public class ExcelExport {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
+ * 取列中最长的行
|
|
|
|
+ * @param cellWidth 列数组
|
|
|
|
+ * @param rows 总行数
|
|
|
|
+ * @param rowValue 开始行数
|
|
|
|
+ * @param sheet 页
|
|
|
|
+ */
|
|
|
|
+ private void findColMaxRowLength(int[] cellWidth, int rows, int rowValue, Sheet sheet){
|
|
|
|
+ for (int col = 0; col < cellWidth.length; col++) {
|
|
|
|
+ for (int row = rowValue; row < rows; row++) {
|
|
|
|
+ Cell cell = sheet.getRow(row).getCell(col);
|
|
|
|
+ String value = getCellValue(cell);
|
|
|
|
+ int length = value.getBytes().length;
|
|
|
|
+ if (length > cellWidth[col]) {
|
|
|
|
+ cellWidth[col] = length;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
* 主要功能: 取单元格的值
|
|
* 主要功能: 取单元格的值
|
|
* 注意事项:按数字和字符两种类型先处理。 BOOLEAN FORMULA 先不处理。 日期格式如何判断?
|
|
* 注意事项:按数字和字符两种类型先处理。 BOOLEAN FORMULA 先不处理。 日期格式如何判断?
|
|
*
|
|
*
|