有一个需求,客户要求前台可以勾选需要展示的列,后台根据前台传过来的需要展示列,来导出符合的Excel表格。
前台列的结构
arrTableTitleData:[
{
header:"REGION",
Column_name: "Region",
hide:true
},
{
header:"PROVINCE",
Column_name:"Province",
hide:true
}]
后台代码
List<PageData> newlist=new ArrayList<PageData>();
List<String> titles = new ArrayList<String>();
for(int i = 0; i < list.size(); i++){
boolean aa= (boolean) list.get(i).get("hide");
if(aa){
titles.add(list.get(i).get("Column_name").toString()); // titles 为显示的列名
newlist.add(list.get(i));
}
}
XSSFWorkbook wb = new XSSFWorkbook();
// 设置标题样式
CellStyle headerStyle = wb.createCellStyle(); //标题样式
headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 设置标题字体
Font headerFont = wb.createFont(); //标题字体
headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
headerFont.setFontHeightInPoints((short)11);
headerStyle.setFont(headerFont);
// 设置文本单元格样式
XSSFCellStyle contextstyle =wb.createCellStyle();
XSSFCellStyle contextstyle1 =wb.createCellStyle();
// 根据页面index 获取sheet页
XSSFSheet sheet1 = wb.createSheet("sheet1");
// 设置标题
XSSFRow rowTitle = sheet1.createRow(0);
for (int i = 0;i< titles.size(); i++){
rowTitle.createCell(i).setCellValue(titles.get(i));
rowTitle.getCell(i).setCellStyle(headerStyle);
}
short width = 20,height=25*20;
sheet1.setDefaultColumnWidth(width);
// -------- 循环数据
以上只是准备工作,接下来是循环数据创建单元格,以及设置样式等
for (int i = 0; i < varOList.size(); i++) { // 循环数据创建行 row 有多少数据就创建多少行
XSSFRow row = sheet1.createRow(i + 1);
for(int j = 0; j < titles.size(); j++){ // 循环title 有多少个title就有多少列,也就是一行创建多少个单元格
// 设置内容
XSSFCell contentCell = row.createCell(j);
String data = varOList.get(i).getString(newlist.get(j).getString("header"));//获取第i行第j列所放数据
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
Boolean isPercent=false;//data是否为百分数
if (data != null || "".equals(data)) {
//判断data是否为数值型
isNum = data.matches("^(-?\\d+)(\\.\\d+)?$");
//判断data是否为整数(小数部分是否为0)
isInteger=data.matches("^[-\\+]?[\\d]*$");
//判断data是否为百分数(是否包含“%”)
isPercent=data.contains("%");
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if (isNum && !isPercent) {
XSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式
contextstyle.setDataFormat(df.getFormat("#0.00"));//保留两位小数点
// 设置单元格格式
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为double类型
contentCell.setCellValue(Double.parseDouble(data));
}else if(isPercent){
XSSFDataFormat dataFormat = wb.createDataFormat(); // 此处设置数据格式
contextstyle1.setDataFormat(dataFormat.getFormat("0.00%"));
contentCell.setCellStyle(contextstyle1);
contentCell.setCellValue(Double.parseDouble(data.split("%")[0])/100);
} else {
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为字符型
contentCell.setCellValue(data);
}
}
}
wb.write(out);
out.close();
wb.close();
这样就成功了,代码粘贴不全,如有需要请留言。
本人经验有限,如有问题,欢迎指正!