>記錄:
>//先設置類型再設值,否則會導致數值變化
>//樣式之間會互相覆蓋
### maven依賴
```xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
```
### 代碼(回頭改)
```java
import com.ucaret.statistics.dao.DetailReportMapper;
import com.ucaret.statistics.query.PgQuery;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ucaret.statistics.service.DetailReportService;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Service(value="detailReportService")
public class DetailReportServiceImpl implements DetailReportService {
@Autowired
private DetailReportMapper detailReportMapper;
@Override
public void downFile() throws Exception{
String fileName = "E:/tem/固定資產房屋明細賬.xlsx"; // 修改的.xlsx文件
String SheetName = "Sheet";
int cpage = 1;//默認第一頁
int pagesize = 5000;//默認5000條
int qingli = pagesize;
XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(fileName));
XSSFSheet xSheet = xwb.getSheetAt(0);
for(int k = 4;k <= xSheet.getLastRowNum();k++){//清理多余數據
if(xSheet.getRow(k) != null){
xSheet.removeRow(xSheet.getRow(k));
}
}
XSSFCellStyle cellStyle = xwb.createCellStyle();
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setAlignment(HorizontalAlignment.CENTER); //居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直
List<Map<String,Object>> roomlist = detailReportMapper.excelFindStoried();
int biao = 0;
for (int i = 0;i < roomlist.size();i++){
int rowget4 = 4+biao;
if(i==0){
qingli+=rowget4;
}
Map<String,Object> pm = roomlist.get(i);
XSSFRow row = xSheet.getRow(rowget4)==null ? xSheet.createRow(rowget4) : xSheet.getRow(rowget4);//獲取一行或創建一行
row.createCell(0).setCellValue(pm.get("storied_no").toString());
row.createCell(1).setCellValue(pm.get("accounting_certificate_no").toString());
row.createCell(2).setCellValue(pm.get("booked_time").toString());
row.createCell(3).setCellValue(pm.get("campus_name").toString());
row.createCell(4).setCellValue(pm.get("storied_name").toString());
row.createCell(5).setCellValue(pm.get("address").toString());
row.createCell(6).setCellValue(pm.get("classify_code").toString());
row.createCell(7).setCellValue(pm.get("use_way").toString());
row.createCell(8).setCellValue(pm.get("building_structure").toString());
row.createCell(9).setCellValue(pm.get("up_floors").toString());
row.createCell(10).setCellValue(pm.get("down_floors").toString());
row.createCell(11).setCellValue(pm.get("completion_date").toString());
row.createCell(12).setCellValue(pm.get("is_own_title_deed").toString());
row.createCell(13).setCellValue(pm.get("title_deed_no").toString());
row.createCell(14).setCellValue(pm.get("title_deed_word").toString());
row.createCell(15).setCellValue(pm.get("right_unit_name").toString());
row.createCell(16).setCellValue(pm.get("split_area").toString());
row.createCell(17).setCellValue(pm.get("deed_use").toString());
row.createCell(18).setCellValue(pm.get("land_certificate_no").toString());
row.createCell(19).setCellValue(pm.get("land_certificate_word").toString());
row.createCell(20).setCellValue(pm.get("usable_area").toString());
row.createCell(21).setCellValue(pm.get("covered_area").toString());
row.createCell(22).setCellValue(pm.get("building_cost").toString());
row.createCell(23).setCellValue(pm.get("remark").toString());
setBorder(xwb,xSheet,rowget4,23);
/*這里不進行先加后創建新目錄,會導致新數據寫入舊目錄*/
biao+=1;
if(biao-pagesize==0 || i == roomlist.size()-1){//提取取消合並避免重復合並異常(第二次無法合並克隆過來合並好的列)
int xiayige = rowget4+1;
xSheet.removeMergedRegion(getMergedRegionIndex(xSheet, qingli, 0));//清理無用的合並單元格,小計
xSheet.removeMergedRegion(getMergedRegionIndex(xSheet, qingli+1, 0));//清理無用的合並單元格,合計
/*取消合並有問題,第一次會取消0行,干脆每次都取消合並下*/
xSheet.removeMergedRegion(getMergedRegionIndex(xSheet, 0, 0));//清理無用的合並單元格,合計
CellRangeAddress regions = new CellRangeAddress(0, 0, 0, 23);//開始行號與結束行號要大於大於等於
xSheet.addMergedRegion(regions);
XSSFRow sumcell = xSheet.getRow(xiayige)==null ? xSheet.createRow(xiayige) : xSheet.getRow(xiayige);//獲取一行或創建一行
sumcell.createCell(0).setCellValue("小計:");
CellRangeAddress region = new CellRangeAddress(xiayige, xiayige, 0, 3);//開始行號與結束行號要大於大於等於
xSheet.addMergedRegion(region);
xSheet.getRow(xiayige).setHeight(toshort(1000));//小計高設置1000,合計設置高700
/*小計統計賦值*/
int sum = pagecount(cpage,pagesize);//用來統計計算的時候,從哪里開始統計
PgQuery obj = new PgQuery(sum,pagesize);
List<Map<String,Object>> total = detailReportMapper.excelSumStoriedTotal(obj);
Map<String,Object> m1;
String v1 = "0";
String v2 = "0";
String v3 = "0";
String v4 = "0";
if(total != null && total.get(0) != null){
m1 = total.get(0);
v1 = m1.get("split_area") == null ? "0" : m1.get("split_area").toString();
v2 = m1.get("usable_area") == null ? "0" : m1.get("usable_area").toString();
v3 = m1.get("covered_area") == null ? "0" : m1.get("covered_area").toString();
v4 = m1.get("building_cost") == null ? "0" : m1.get("building_cost").toString();
XSSFCellStyle cstyle = xwb.createCellStyle();
XSSFDataFormat df = xwb.createDataFormat();
cstyle.setDataFormat(df.getFormat("#,##0.00"));
xSheet.getRow(xiayige).createCell(16).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(16).setCellValue(v1);
xSheet.getRow(xiayige).createCell(20).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(20).setCellValue(v2);
xSheet.getRow(xiayige).createCell(21).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(21).setCellValue(v3);
xSheet.getRow(xiayige).createCell(22).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(22).setCellValue(v4);
setBorder(xwb, xSheet, xiayige, 23);
xSheet.getRow(xiayige).getCell(0).setCellStyle(cellStyle);
}
xiayige = rowget4+2;
XSSFRow sumcell_2 = xSheet.getRow(xiayige)==null ? xSheet.createRow(xiayige) : xSheet.getRow(xiayige);//獲取一行或創建一行
sumcell_2.createCell(0).setCellValue("合計:");
CellRangeAddress region_2 = new CellRangeAddress(xiayige, xiayige, 0, 3);//開始行號與結束行號要大於大於等於
xSheet.addMergedRegion(region_2);
xSheet.getRow(xiayige).setHeight(toshort(700));//小計高設置1000,合計設置高700
/*總計統計賦值*/
List<Map<String,Object>> count = detailReportMapper.excelSumStoriedCount();
if(count != null && count.get(0) != null){
m1 = count.get(0);
v1 = m1.get("split_area") == null ? "0" : m1.get("split_area").toString();
v2 = m1.get("usable_area") == null ? "0" : m1.get("usable_area").toString();
v3 = m1.get("covered_area") == null ? "0" : m1.get("covered_area").toString();
v4 = m1.get("building_cost") == null ? "0" : m1.get("building_cost").toString();
XSSFCellStyle cstyle = xwb.createCellStyle();
XSSFDataFormat df = xwb.createDataFormat();
cstyle.setDataFormat(df.getFormat("#,##0.0"));
xSheet.getRow(xiayige).createCell(16).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(16).setCellValue(v1);
xSheet.getRow(xiayige).createCell(20).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(20).setCellValue(v2);
xSheet.getRow(xiayige).createCell(21).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(21).setCellValue(v3);
xSheet.getRow(xiayige).createCell(22).setCellStyle(cstyle);
xSheet.getRow(xiayige).getCell(22).setCellValue(v4);
setBorder(xwb, xSheet, xiayige, 23);
xSheet.getRow(xiayige).getCell(0).setCellStyle(cellStyle);
}
cpage+=1;//頁數+1
}
if(biao-pagesize==0){
biao = 0;
/*克隆創建新sheet,防止sheet重名*/
int num = zhengzetiqv(SheetName);
num+=1;
SheetName = "Sheet"+num;
for(int f = 0;f<999;f++){
if(xwb.getSheet(SheetName) == null){
xSheet = xwb.cloneSheet(0,SheetName);//克隆創建新sheet
for(int k = 4;k <= xSheet.getLastRowNum();k++){//清理多余數據
if(xSheet.getRow(k) != null){
xSheet.removeRow(xSheet.getRow(k));
}
}
break;
}else{
num+=1;
SheetName = "Sheet"+num;
}
}
}
}
/*導出*/
FileOutputStream fileOutputStream = null;
String ph = "E:\\構築物信息表" + System.currentTimeMillis() + ".xlsx";
System.out.println(ph);
fileOutputStream = new FileOutputStream(ph);//文件名必須拼接好
xwb.write(fileOutputStream);//HSSFWorkbook寫入文件流
}
@Override
public List<Map<String, Object>> excelFindStoried() {
return detailReportMapper.excelFindStoried();
}
/**
* string轉換成short類型
* @param ob
* @return
*/
public static Short toshort(Object ob) {
String val = String.valueOf(ob);
Short s = Short.valueOf(val);
return s;
}
/**
* 從字符串提取數字,使用正則表達式
* @param a
* @return
*/
public int zhengzetiqv(String a){
String regEx="[^0-9]";
int num;
if((a==null)||(a.equals(""))){
num = 0;
}else{
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(a);
String str = m.replaceAll("").trim();
if((str==null)||(str.equals(""))){
num = 0;
}else{
num = Integer.valueOf(str);
}
}
return num;
}
/**
* 用來清理合並的區域,獲取區域 Region
* @param sheet
* @param row 開始行
* @param column 開始列
* @return
*/
public static int getMergedRegionIndex(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return i;
}
}
}
return 0;
}
/**
* 分頁計算,從哪開始顯示
* @param kaishiye 第幾頁
* @param tiaoshu 顯示多少條
* @return limit 返回值是從哪一行開始
*/
public int pagecount(int kaishiye,int tiaoshu){
int ye = kaishiye; //第幾頁,第一頁0開始
int tiao = tiaoshu; //顯示多少條
ye = ye - 1; //(實際頁數從0開始,所以提前-1)
int count = tiao * ((ye-1) + 1);
return count;
}
/**
* 設置邊框樣式
* @param xwb XSSFWorkbook對象
* @param xSheet XSSFSheet對象
* @param row 哪一行
* @param size 多少條(包括本數字)
*/
public void setBorder(XSSFWorkbook xwb,XSSFSheet xSheet,int row,int size){
XSSFCellStyle borderstyle = xwb.createCellStyle();
borderstyle.setBorderTop(BorderStyle.THIN);
borderstyle.setBorderBottom(BorderStyle.THIN);
borderstyle.setBorderLeft(BorderStyle.THIN);
borderstyle.setBorderRight(BorderStyle.THIN);
XSSFRow rows = xSheet.getRow(row) == null ? xSheet.createRow(row) : xSheet.getRow(row);
for (int i = 0; i <= size;i++){
if(rows.getCell(i) == null){//空則創建
rows.createCell(i).setCellStyle(borderstyle);
}else{
rows.getCell(i).setCellStyle(borderstyle);
}
}
}
}
```