最近项目中需要将table 中数据导出到excel ,当时我想的两种方案,一种是通过前端插件TableExport.js。发现简单使用的话,只是可以导出table 中原生的数据。一旦table 有jstl 标签判断的话,它读不到。最后采取通过服务端到来实现导出Excel 格式是.xlsx。这个方案可以导出大量的数据。分页显示。核心代码如下;
1、这个公用的方法不带表头标题的。
/**
* 不带表头的Excel
* @param title
* @param headMap
* @param jsonArray
* @param datePattern
* @param colWidth
* @param out
*/
public static void exportToExcel(Map headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) {
if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;
// 声明一个工作薄
SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存
workbook.setCompressTempFiles(true);
// 生成一个表格
SXSSFSheet sheet = workbook.createSheet();
//设置列宽
int minBytes = colWidth iter = headMap.keySet().iterator(); iter
.hasNext();) {
String fieldName = iter.next();
properties[ii] = fieldName;
headers[ii] = headMap.get(fieldName);
int bytes = fieldName.getBytes().length;
arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;
sheet.setColumnWidth(ii,arrColWidth[ii]*256);
ii++;
}
// 遍历集合数据,产生数据行
int rowIndex = 0;
for (Object obj : jsonArray) {
if(rowIndex == 65535 || rowIndex == 0){
if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第二页显示
SXSSFRow headerRow = sheet.createRow(0); //列头 rowIndex =1
for(int i=0;i
2、如何调用。
/**
* 整合数据导出到Excle
*
* @param response
* @param userApplyMap
*/
public void exportExcle(HttpServletResponse response, List
/**
* 导出excle
*
* @param userApplySearchVo
* @param request
* @param response
*/
@RequestMapping("/exportInfo")
public void exportInfo(UserApplySearchVo userApplySearchVo, HttpServletRequest request,
HttpServletResponse response) {
try {
Map params = new HashMap<>();
creatParams(userApplySearchVo, params);
List
3、效果图,号码随便抓的就打码。