JAVA導出Excel

前臺需用表單提交方式!

導包:

<!--excel導入導出 start-->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.15</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.15</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>3.15</version>
</dependency>
<!--excel導入導出 end-->

ExcelUtil類



import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * Excel工具類.
 * <p><br>
 * @author ZLJ 2019-11-17 下午09:21:33
 * @version 1.0.0
 */
public class ExcelUtil {
    /**
     * 取得標題單元格樣式.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午10:56:15<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午10:56:15<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param wb
     * @return
     */
    private static HSSFCellStyle getTitleCellStyle(HSSFWorkbook wb){
        //創建單元格樣式
        HSSFCellStyle styleTemp = wb.createCellStyle();

        //創建字體
        HSSFFont fontTemp = wb.createFont();
        //字號
        fontTemp.setFontHeightInPoints((short) 11);
        //粗體寬度
        fontTemp.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        //設置對齊方式
        styleTemp.setAlignment((short)2);
        //將文字樣式設置給樣式
        styleTemp.setFont(fontTemp);
        //設置邊框
        styleTemp.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        styleTemp.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        styleTemp.setBorderRight(HSSFCellStyle.BORDER_THIN);
        styleTemp.setBorderTop(HSSFCellStyle.BORDER_THIN);

        return styleTemp;
    }

    /**
     * 取得內容單元格樣式.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午10:56:43<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午10:56:43<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param wb
     * @return
     */
    private static HSSFCellStyle getContentCellStyle(HSSFWorkbook wb){
        //創建單元格樣式
        HSSFCellStyle styleTemp = wb.createCellStyle();

        //設置邊框
        styleTemp.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        styleTemp.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        styleTemp.setBorderRight(HSSFCellStyle.BORDER_THIN);
        styleTemp.setBorderTop(HSSFCellStyle.BORDER_THIN);

        return styleTemp;
    }

    /**
     * 創建單元格.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午02:56:06<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午02:56:06<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param row			行
     * @param cellNo		列號,從0開始
     * @param cellContent	列內容
     * @return	列
     */
    private static HSSFCell createCell(HSSFRow row, HSSFCellStyle style, int cellNo, String cellContent){
        //創建第一列:註冊號
        HSSFCell cell=row.createCell(cellNo);
        //將樣式設置給單元格
        cell.setCellStyle(style);
        //設置單元格的值
        HSSFRichTextString rts = new HSSFRichTextString(cellContent);
        cell.setCellValue(rts);

        return cell;
    }

    /**
     * 創建單元格.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午02:51:58<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午02:51:58<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param wb			工作簿
     * @param sheet			工作表
     * @param style		單位格樣式
     * @param row			行
     * @param cellNo		列號,從0開始
     * @param cellWidth		列寬
     * @param cellContent	列內容
     * @return	列對象
     */
    private static HSSFCell createCell(HSSFWorkbook wb, HSSFSheet sheet, HSSFRow row, HSSFCellStyle style,
                                       int cellNo, int cellWidth, String cellContent){
        //創建列
        HSSFCell cell=row.createCell(cellNo);
        //將樣式設置給單元格
        cell.setCellStyle(style);
        //設置列寬
        sheet.setColumnWidth(cellNo, cellWidth * 256);
        //設置單元格的值
        HSSFRichTextString rts = new HSSFRichTextString(cellContent);
        cell.setCellValue(rts);

        return cell;
    }

    /**
     * 取得單元格數據.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午05:07:00<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午05:07:00<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param cell	單元格對象
     * @return	單元格數據,字符串
     */
    @SuppressWarnings({ "deprecation" })
    public static String getCellStringValue(HSSFCell cell) {
        if(cell == null) {
            return "";
        }

        String cellValue = "";
        switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_STRING://字符串類型
                cellValue = cell.getStringCellValue();
                if(cellValue.trim().equals("")||cellValue.trim().length() <= 0)
                    cellValue = "";
                break;
            case HSSFCell.CELL_TYPE_NUMERIC: //數值類型
                // 判斷當前的cell是否爲Date
                if (HSSFDateUtil.isCellDateFormatted(cell)){
                    // 如果是Date類型則,取得該Cell的Date值
                    Date date = cell.getDateCellValue();

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    cellValue = sdf.format(date);
                } else{  // 如果是純數字
                    DecimalFormat df = new DecimalFormat("#");//轉換成整型
                    cellValue = String.valueOf(df.format(cell.getNumericCellValue()));
                }
                break;
            case HSSFCell.CELL_TYPE_FORMULA: //公式
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                cellValue = "";
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:

                break;
            case HSSFCell.CELL_TYPE_ERROR:
                break;
            default:
                break;
        }

        return cellValue;
    }

    /**
     * 導出報表.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午11:43:57<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午11:43:57<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param response
     * @param reportFileName	報表文件名
     * @param colWidths			列寬度
     * @param titles			標題列數組
     * @param contents			內容數組
     */
    public static void ExportReport(HttpServletResponse response, String reportFileName,
                                    int[] colWidths, String[] titles, String[][] contents){
        //創建HSSFWorkbook對象
        HSSFWorkbook wb = new HSSFWorkbook();
        //創建HSSFSheet對象
        HSSFSheet sheet = wb.createSheet("sheet1");

        //取得標題單元格樣式
        HSSFCellStyle styleTitle = getTitleCellStyle(wb);
        //創建HSSFRow對象
        HSSFRow row = sheet.createRow((short)0);
        row.setHeight((short) (1.5 * 256));
        //創建列頭
        for(int i=0;i<colWidths.length;i++) {
            createCell(wb, sheet, row, styleTitle, i, colWidths[i], titles[i]);
        }

        if(contents != null && contents.length > 0) {
            //取得內容單元格樣式
            HSSFCellStyle styleContent = getContentCellStyle(wb);

            for(int i=0;i<contents.length;i++) {
                //創建HSSFRow對象
                row = sheet.createRow((short)(i + 1));
                row.setHeight((short) (1.2 * 256));

                for(int j=0;j<contents[i].length;j++) {
                    createCell(row, styleContent, j, contents[i][j]);
                }
            }
        }
        try	{
            //將Excel數據發送到客戶端瀏覽器
            ExportFileUtil.writeToClient(response, wb, reportFileName + ".xls");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }



}

ExportFileUtil導出文件工具:



import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * 導出文件工具.
 * <p><br>
 * @author ZLJ 2019-11-17 下午08:29:47
 * @version 1.0.0
 */
public class ExportFileUtil {
    /**
     * 將文件寫到客戶端.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午08:32:44<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17  下午08:32:44<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param response
     * @param mimeType		MIMI類型
     * @param fileName		文件名
     * @param bos			文件字節數組
     * @throws Exception
     */
    public static void writeToClient(HttpServletResponse response, String mimeType, String fileName, ByteArrayOutputStream bos) throws Exception{
        response.reset();
        response.setContentType(mimeType);
        response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "iso8859-1") );
        response.setContentLength(bos.size());
        //禁止頁面緩存
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        ServletOutputStream sos = response.getOutputStream();
        bos.writeTo(sos);
        sos.flush();
        sos.close();
        bos.close();
    }

    /**
     * 將Excel文件在客戶端導出.
     * <p><b>創建人:</b><br>&nbsp;&nbsp; ZLJ 2019-11-17 下午09:40:06<br>
     * <p><b>修改人:</b><br>&nbsp;&nbsp; 2019-11-17 下午09:40:06<br>
     * <p><b>修改說明:</b><br>&nbsp;&nbsp;<br>
     * @param response
     * @param wb
     * @param defaultFileName  客戶端保存時顯示的文件名稱
     */
    public static void writeToClient(HttpServletResponse response, HSSFWorkbook wb, String defaultFileName){
        OutputStream toClient = null;
        ByteArrayOutputStream bOut = null;
        try {
            bOut = new ByteArrayOutputStream();

            //把相應的Excel工作簿寫入內存流
            wb.write(bOut);

            response.reset();
			
            response.setHeader("Access-Control-Allow-Origin", "*");//允許所有域名訪問





            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(defaultFileName.getBytes("GBK"), "iso8859-1"));
            response.setContentLength(bOut.size());
            //得到向客戶端輸出二進制數據的對象
            toClient = new BufferedOutputStream(response.getOutputStream());
            //設置瀏覽器mime類型
            response.setContentType("application/vnd.ms-excel; charset=GBK");

            //輸出數據
            toClient.write(bOut.toByteArray());
            toClient.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bOut.close();

                toClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
int[] colWidth = { 30, 60,60,20,20,30};
測試調:
        ExcelUtil.ExportReport(response, reportFileName, colWidth, title, strarrs);//傳入對應的參數即可`在這裏插入代碼片`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章