一、場景
根據(jù)模板樣式進行excel導出。
二、實現(xiàn)
首先,當然是要有一個excel模板,excel的樣式用wps等進行設置。
然后就是代碼的實現(xiàn)了,先引入POI的依賴:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
然后就是實現(xiàn)方法里的代碼,首先定義響應信息:
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
// 設置響應類型
response.setContentType("application/vnd.ms-excel");
// 設置字符編碼
response.setCharacterEncoding("utf-8");
// 設置響應頭信息
response.setHeader("Content-Disposition", "attachment; filename="文件名.xlsx", "utf-8"));
然后將excel模板轉為輸入流,這一步的實現(xiàn)方法有很多,具體選擇因人而異,我這里就舉一個例子:
org.springframework.core.io.Resource resource = new ClassPathResource("templates/文件名.xlsx");
@Cleanup InputStream inputStream = resource.getInputStream();
ServletOutputStream outputStream = response.getOutputStream();
然后獲取excel模板數(shù)據(jù):
XSSFWorkbook workbook = new XSSFWorkbook(inputStream); // 傳入上一步轉換的輸入流
Sheet sheet = workbook.getSheetAt(0); // 拿到excel模板的sheet頁
我們得到excel模板數(shù)據(jù)后,肯定不是原模原樣導出,否則直接io輸出就好了。接下來就是操作excel模板數(shù)據(jù),將它構造為我們要導出的excel,我這里僅組合一些常用的操作,具體操作根據(jù)個人情況自行組合:文章來源:http://www.zghlxwxcb.cn/news/detail-629472.html
/**
* 修改某單元格的值,先獲取y行再獲取y行的x列,然后修改值
*
* x(列,從0開始計數(shù))
* y(行,從0開始計數(shù))
* value(修改值)
*/
sheet.getRow(y).getCell(x).setCellValue(value);
/**
* 插入n行,首先用shiftRows方法將插入位置后面的數(shù)據(jù)都向下移動n行
* 然后循環(huán)用createRow方法構造當前行,并用setHeightInPoints方法設置行高
* 最后循環(huán)用createCell方法構造當前行的列
*
* startRow(插入位置的下一行,從0開始計數(shù))
* endRow(excel表末尾行,從0開始計數(shù))
* startColumn(插入行的開始列,從0開始計數(shù))
* endColumn(插入行的結束列,從0開始計數(shù))
* rowNum(插入行數(shù))
* rowHeight(插入行高)
*/
sheet.shiftRows(startRow, endRow, rowNum, true, false);
for (int i = 0; i < rowNum; i++) {
Row itemRow = sheet.createRow(startRow + i);
itemRow.setHeightInPoints(rowHeight);
for (int j = startColumn; j < endColumn + 1; j++) {
itemRow.createCell(j);
}
}
/**
* 得到某單元格的樣式,先獲取y行再獲取y行的x列,然后得到樣式
*
* x(列,從0開始計數(shù))
* y(行,從0開始計數(shù))
*/
CellStyle style = sheet.getRow(y).getCell(x).getCellStyle();
/**
* 修改某單元格的樣式,先獲取y行再獲取y行的x列,然后修改樣式
*
* x(列,從0開始計數(shù))
* y(行,從0開始計數(shù))
* style(修改樣式)
*/
sheet.getRow(y).getCell(x).setCellStyle(style);
/**
* 合并單元格
*
* startRow(開始行,從0開始計數(shù))
* endRow(結束行,從0開始計數(shù))
* startColumn(開始列,從0開始計數(shù))
* endColumn(結束列,從0開始計數(shù))
*/
sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, startColumn, endColumn));
最后輸出excel:文章來源地址http://www.zghlxwxcb.cn/news/detail-629472.html
workbook.write(outputStream);
三、總結
- 將excel表抽象為xy軸坐標圖,更易于理解POI的操作,y軸對應行,x軸對應列,每個單元格都有一個xy坐標。
- 單元格才是實際可操作的對象,行和列都只是用來定位單元格位置的。所以新增行后都要根據(jù)列數(shù)進行循環(huán),來新增單元格。
- 新增的單元格都不具備任何樣式,可以獲取其他單元格的樣式進行賦予。
- 如果不涉及對模板新增行、新增列等操作,那修改一下單元格的值就夠用了,畢竟單元格樣式完全可以在wps先設置好。
到了這里,關于【Java】使用POI按模板樣式導出Excel的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!