1. 程式人生 > >使用poi向excel中插入內容遇到的問題總結

使用poi向excel中插入內容遇到的問題總結

1、如何插入圖片?
在poi中有HSSFPatriarch物件,該物件為畫圖的頂級管理器,一個sheet只可以建立一個。它的createPicture(anchor,pictureIndex)方法可以在excel中插入一張圖片。
具體程式碼我們可以封裝成一個方法:

    public static void setPicture(Workbook wb,HSSFPatriarch patriarch,String path, int iRowStart, int iColStart, int iRowStop, int iColStop){
            File file = new
File(path); if(file.exists()){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); //從檔案中讀取圖片 BufferedImage bufferImage = ImageIO.read(file); //以指定格式寫入輸出流 ImageIO.write(bufferImage,"jpg",bos); //定義圖片在excel中的位置,選取自己合適的位置座標
HSSFClientAnchor anchor = new HSSFClientAnchor(20, 1, 1018, 0, (short) (iColStart), iRowStart, (short) (iColStop), iRowStop); //加入圖片 patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); } }

2、如何畫線?
同樣的,畫線也是由HSSFPatriarch物件建立的,具體封裝程式碼如下

    public static void drawLine(Workbook wb,HSSFPatriarch patriarch,int iRowStart, int iColStart, int iRowStop, int iColStop){
            //線的位置由這個類控制
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 350, 0, (short) (iColStart), iRowStart, (short) (iColStop), iRowStop);
            HSSFSimpleShape lineShape = patriarch.createSimpleShape(anchor);
            //畫線
            lineShape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
        }

3、 如何畫矩形?

    HSSFSheet sheet = workbook.createSheet("Test");// 建立工作表(Sheet)
    HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
    HSSFClientAnchor anchor = new HSSFClientAnchor(255,122, 255, 122, (short)1, 0,(short)4, 3);
    HSSFSimpleShape rec = patriarch.createSimpleShape(anchor);
    rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
    rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//設定邊框樣式
    rec.setFillColor(255, 0, 0);//設定填充色
    rec.setLineWidth(25400);//設定邊框寬度
    rec.setLineStyleColor(0, 0, 255);//設定邊框顏色

4、如何設定單元格換行?

    CellStyle cellstyle = wb.createCellStyle();
    cellstyle.setWrapText(true);//true表示自動換行

5、如何進行資料格式化?
資料格式化要藉助HSSFDataFormat這個類,當使用Excel內嵌的(或者說預定義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態方法即可。當使用自己定義的格式時,必須先呼叫HSSFDataFormat format= HSSFWorkbook.createDataFormat()。

    HSSFSheet sheet = workbook.createSheet("Test");// 建立工作表(Sheet)
    HSSFRow row=sheet.createRow(0);
    //設定日期格式--使用Excel內嵌的格式
    HSSFCell cell=row.createCell(0);
    cell.setCellValue(new Date());
    HSSFCellStyle style=workbook.createCellStyle();
    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
    cell.setCellStyle(style);
    //設定保留2位小數--使用Excel內嵌的格式
    cell=row.createCell(1);
    cell.setCellValue(12.3456789);
    style=workbook.createCellStyle();
    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
    cell.setCellStyle(style);
    //設定貨幣格式--使用自定義的格式
    cell=row.createCell(2);
    cell.setCellValue(12345.6789);
    style=workbook.createCellStyle();
    style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));
    cell.setCellStyle(style);
    //設定百分比格式--使用自定義的格式
    cell=row.createCell(3);
    cell.setCellValue(0.123456789);
    style=workbook.createCellStyle();
    style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));
    cell.setCellStyle(style);
    //設定中文大寫格式--使用自定義的格式
    cell=row.createCell(4);
    cell.setCellValue(12345);
    style=workbook.createCellStyle();
    style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));
    cell.setCellStyle(style);
    //設定科學計數法格式--使用自定義的格式
    cell=row.createCell(5);
    cell.setCellValue(12345);
    style=workbook.createCellStyle();
    style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));
    cell.setCellStyle(style);

6、如何使用公式?

    cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
    cell.setCellFormula("sum(A1,C1)");

7、單元格設定邊框
注意單元格合併後,設定邊框,並不會為其他的(未合併前)單元格設定邊框,所以其他邊框得自己手動補上

    curStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 實線右邊框
    curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 實線右邊框
    curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 實線右邊框
    curStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 實線右邊框

8、設定分頁符
sheet.setRowBreak(開始行);
9、另外提供下載excel的方法:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    wb.write(bos);
    DownloadUtil.download(bos, response, " XXX.xls");

        //下載函式
    public static void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException{
        response.setContentType("application/octet-stream;charset=utf-8");
        response.setHeader("Content-Disposition",   "attachment;filename=" + URLEncoder.encode(returnName, "UTF-8"));  
        response.setContentLength(byteArrayOutputStream.size());

        ServletOutputStream outputstream = response.getOutputStream();  //取得輸出流
        byteArrayOutputStream.writeTo(outputstream);                    //寫到輸出流
        byteArrayOutputStream.close();                                  //關閉
        outputstream.flush();                                           //刷資料
    }