使用poi向excel中插入內容遇到的問題總結
阿新 • • 發佈:2019-01-05
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(); //刷資料
}