從數據庫查詢數據寫入excel(Java使用POI寫入Excel)


  因為要查一個線上bug,需要排查的線上訂單量非常大,時間緊任務重,為了快速查詢排查我花了1個多小時寫了一個方法來解決這個問題,

大概的思路:連接線上數據庫,循環查詢數據后寫入excel文件。后續通個excel數據分析,排查問題。

  在實現我的這個思路的過程中,我需要知道怎么寫入excel,我參考了Dreamer-1 寫的這篇文章《Java使用POI讀取和寫入Excel指南》https://www.cnblogs.com/Dreamer-1/p/10469430.html,

怎么讀寫excel,全中文,我覺得寫的很棒。我就是抄他的。下面圖解我的實現過程:

第一步,我要先從數據庫查詢到我要的數據

用了一個很好用的小的數據庫插件NewbieJdbc,對於測試同學來說,我覺得非常實用,推薦使用,自己需要可以百度一下。

 

 

通過上一步得到數據后,就要映射成需要打印的文件

第二步輸出文檔

 

 

這里有一個很重要的步驟,負責excel對象數據初始化的

Workbook workbook = PoilWriteExcel.exportData(searchData());

整個的PoilWriteExcel這個類都是抄的Dreamer-1 寫的方法,只是把我要的數據改了一下,另外重寫了我的vo對象TransExcelDataVO
他的文章寫的很詳細。因為時間很急,事后再看的時候覺得后面可以根據個人的需要做其他改動,非常棒。貼一下我改的PoilWriteExcel這個類。
public  class PoilWriteExcel {
private static List<String> CELL_HEADS; //列頭

static{
// 類裝載時就載入指定好的列頭信息,如有需要,可以考慮做成動態生成的列頭
CELL_HEADS = new ArrayList<>();
// CELL_HEADS.add("姓名");
// CELL_HEADS.add("年齡");
// CELL_HEADS.add("居住城市");
// CELL_HEADS.add("職業");
CELL_HEADS.add("訂單號");
CELL_HEADS.add("租客號");
CELL_HEADS.add("訂單狀態");
CELL_HEADS.add("操作時間");
CELL_HEADS.add("車輛號");
}

/**
* 生成Excel並寫入數據信息
* @param dataList 數據列表
* @return 寫入數據后的工作簿對象
*/
public static Workbook exportData(List<TransExcelDataVO> dataList){
// 生成xlsx的Excel
Workbook workbook = new SXSSFWorkbook();

// 如需生成xls的Excel,請使用下面的工作簿對象,注意后續輸出時文件后綴名也需更改為xls
//Workbook workbook = new HSSFWorkbook();

// 生成Sheet表,寫入第一行的列頭
Sheet sheet = buildDataSheet(workbook);
//構建每行的數據內容
int rowNum = 1;
for (Iterator<TransExcelDataVO> it = dataList.iterator(); it.hasNext(); ) {
TransExcelDataVO data = it.next();
if (data == null) {
continue;
}
//輸出行數據
Row row = sheet.createRow(rowNum++);
convertDataToRow(data, row);
}
return workbook;
}

/**
* 生成sheet表,並寫入第一行數據(列頭)
* @param workbook 工作簿對象
* @return 已經寫入列頭的Sheet
*/
private static Sheet buildDataSheet(Workbook workbook) {
Sheet sheet = workbook.createSheet();
// 設置列頭寬度
for (int i=0; i<CELL_HEADS.size(); i++) {
sheet.setColumnWidth(i, 4000);
}
// 設置默認行高
sheet.setDefaultRowHeight((short) 400);
// 構建頭單元格樣式
CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
// 寫入第一行各列的數據
Row head = sheet.createRow(0);
for (int i = 0; i < CELL_HEADS.size(); i++) {
Cell cell = head.createCell(i);
cell.setCellValue(CELL_HEADS.get(i));
cell.setCellStyle(cellStyle);
}
return sheet;
}

/**
* 設置第一行列頭的樣式
* @param workbook 工作簿對象
* @return 單元格樣式對象
*/
private static CellStyle buildHeadCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
//對齊方式設置
style.setAlignment(HorizontalAlignment.CENTER);
//邊框顏色和寬度設置
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框
//設置背景顏色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//粗體字設置
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
return style;
}

/**
* 將數據轉換成行
* @param data 源數據
* @param row 行對象
* @return
*/
private static void convertDataToRow(TransExcelDataVO data, Row row){
// private String order_no; //訂單
// private String renter_no; //租客號
// private String status; //訂單狀態
// private String op_time; //訂單操作時間
// private String car_no; //車輛號
int cellNum = 0;
Cell cell;
// 訂單
cell = row.createCell(cellNum++);
cell.setCellValue(null == data.getOrder_no() ? "" : data.getOrder_no());

// 租客號
cell = row.createCell(cellNum++);
if (null != data.getRenter_no()) {
cell.setCellValue(data.getRenter_no());
} else {
cell.setCellValue("");
}
// 訂單狀態
cell = row.createCell(cellNum++);
cell.setCellValue(null == data.getStatus() ? "" : data.getStatus());

// 訂單操作時間
cell = row.createCell(cellNum++);
cell.setCellValue(null == data.getOp_time() ? "" : data.getOp_time());

// 車輛號
cell = row.createCell(cellNum++);
cell.setCellValue(null == data.getCar_no() ? "" : data.getCar_no());
}
}

寫這文章的目的不只是分享,重要的是讓自己再學習一遍。因為不經常寫代碼,總有很多功能有想法,但是實現起來特別難。
最近的一段時間工作節奏不是很忙,有時間的時候我就完善自己寫的app的ui自動化框架,最大的收獲就是抄代碼越來越快了。今天就寫到這邊吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM