POI 导出Excel 并且根据内容设置列宽自适应

package com.XXX;


import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import com.eos.system.annotation.Bizlet;
import commonj.sdo.DataObject;

public class ExcelExportUtil {

    /**
     * 
     * Excel导出
     * @author RangoLan
     * @param criteriaEntity DataObject 获取填充数据源的查询对象
     * @param fileName 生成的文件名前缀
     * @param response HttpServletResponse响应
     * @param colToProperty 表格列名和DataObject对象Property应的LinkedHashMap
     * @param datePattern 日期格式数据格式
     * @param HttpServletRequest request 请求对象,用于无数据输出时,内部跳转
     * @param backPage 执行查询后无数据时返回画面
     */

    @Bizlet("数据写入Excel并生成下载")
    public static void exportExcel(String fileName,HttpServletRequest request,HttpServletResponse response,DataObject criteriaEntity,LinkedHashMap<String,String> colToProperty,String datePattern,String backPage) throws Exception {

        //根据查询对象criteria填充数据源
        DataObject[] datas = (DataObject[])com.eos.foundation.database.DatabaseUtil.queryEntitiesByCriteriaEntity("default", criteriaEntity);
        if (datas != null && datas.length > 0) {

            if(datePattern==null){
                datePattern = "yyyy-MM-dd";
            }

            SXSSFWorkbook workbook = new SXSSFWorkbook(1000);

            /** 设置格式* */
            workbook.setCompressTempFiles(true);

            // 表头样式
            CellStyle headerStyle = workbook.createCellStyle();

            //水平居中
            headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
            //垂直居中
            headerStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            //设置边框
            headerStyle.setBorderTop(CellStyle.BORDER_THIN);
            headerStyle.setBorderRight(CellStyle.BORDER_THIN);
            headerStyle.setBorderBottom(CellStyle.BORDER_THIN);
            headerStyle.setBorderLeft(CellStyle.BORDER_THIN);

            //设置颜色
            headerStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);
            headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);


            Font headerFont = workbook.createFont();
            headerFont.setFontHeightInPoints((short) 12);
            headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            headerStyle.setFont(headerFont);
            // 单元格样式
            CellStyle cellStyle = workbook.createCellStyle();
            cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
            //垂直居中
            cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            //设置边框
            cellStyle.setBorderTop(CellStyle.BORDER_THIN);
            cellStyle.setBorderRight(CellStyle.BORDER_THIN);
            cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
            cellStyle.setBorderLeft(CellStyle.BORDER_THIN);

            //设置自动换行
            cellStyle.setWrapText(true);



            //设置字体
            Font cellFont = workbook.createFont();
            cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            cellStyle.setFont(cellFont);

            //DataObject属性Property数组
            String[] properties = new String[colToProperty.size()];
            //表头数组
            String[] headers = new String[colToProperty.size()];

            int ii = 0;
            for (Iterator<String> iter = colToProperty.keySet().iterator();iter.hasNext();) {
                String fieldName = iter.next();

                headers[ii] = fieldName;

                properties[ii] = colToProperty.get(fieldName);

                ii++;
            }

            // 遍历集合数据,产生数据行,填充Excel
            int rowIndex = 0;
            Sheet sheet = null;
            for (DataObject data : datas) {

                if (rowIndex == 65535 || rowIndex == 0) {

                    sheet = workbook.createSheet();// 如果数据超过了,则在第二页显示




                    Row headerRow = sheet.createRow(0);// 表头 rowIndex=0

                    for (int i = 0; i < headers.length; i++) {
                        headerRow.createCell(i).setCellValue(headers[i]);
                        //设置表头样式
                        headerRow.getCell(i).setCellStyle(headerStyle);

                    }



                    rowIndex = 1;// 数据内容从 rowIndex=1开始
                }

                //创建行
                Row dataRow = sheet.createRow(rowIndex);

                for (int i = 0; i < properties.length; i++) {
                    //创建单元格
                    Cell newCell = dataRow.createCell(i);

                    Object o = data.get(properties[i]);
                    String cellValue = "";
                    if (o == null) {//为空处理
                        cellValue = "";
                    } else if (o instanceof Date) {//日期格式化处理
                        cellValue = new SimpleDateFormat(datePattern).format(o);
                    } else {
                        cellValue = o.toString();
                    }
                    //单元格赋值
                    newCell.setCellValue(cellValue);
                    //单元格格式设置
                    newCell.setCellStyle(cellStyle);
                }
                rowIndex++;

            }

            OutputStream out = null;

            //设置自动列宽

            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
                sheet.setColumnWidth(i,sheet.getColumnWidth(i)*17/10);
            }

            try {
                out = response.getOutputStream();
                fileName = fileName
                        + "_"
                        + new SimpleDateFormat("yyyyMMDDhh24mmssSSS")
                                .format(System.currentTimeMillis()) + ".xlsx";
                response.setContentType("application/x-msdownload");
                response.setHeader("Content-Disposition",
                        "attachment; filename="
                                + URLEncoder.encode(fileName, "UTF-8"));
                // 保存报表文件
                workbook.write(out);
            } catch (IOException e) {

                e.printStackTrace();
            } finally {
                try {
                    if (out != null)
                        out.close();
                    response.flushBuffer();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }


        } else {

            // 无导出数据

            request.setAttribute("noDataToExport", "没有数据可以导出!");
            request.getRequestDispatcher(backPage).forward(request, response);


        }



    }

强调的是设置自适应列宽:sheet.autoSizeColumn(i);只这样设置是没有很好的效果的。所以采取了以下两步:

**1. sheet.autoSizeColumn(i);//先设置自动列宽
2. sheet.setColumnWidth(i,sheet.getColumnWidth(i)17/10);//设置列宽为自动列宽的1.7倍(当然不是严格的1.7倍,int的除法恕不再讨论),这个1.6左右也可以,这是本人测试的经验值*

经过本人测试,能够将excel的列宽很好的更具单元格的内容进行设置。

(PS:特别想说的是由于架构和项目需要,所以做成了这样,仅供参考。)

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值