package com.jesse.commons; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; import java.lang.reflect.Field; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; /** * @author wpx * @date: 2019/10/21 */ public class ExportExcelUtil { /** * 固定列寬 */ private static final Integer WIDTH = 5120; /** * 導出excel * @param title sheet標題 * @param rowNames 第一行 * @param dataList 數據列表 * @param <T> 封裝數據 * @return * @throws Exception */ public static <T> XSSFWorkbook export(String title, LinkedHashMap<String, String> rowNames, List<T> dataList) throws Exception{ XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(title); //產生標題行 XSSFRow rowm = sheet.createRow(0); XSSFCell cellTitle = rowm.createCell(0); //sheet樣式定義【】 XSSFCellStyle columnTopStyle = getColumnTopStyle(workbook); sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowNames.size() - 1))); cellTitle.setCellStyle(columnTopStyle); cellTitle.setCellValue(title); // 定義所需列數 int columnNum = rowNames.size(); XSSFRow rowRowName = sheet.createRow(2); // 將列頭設置到sheet的單元格中 Set<String> keySet = rowNames.keySet(); Iterator<String> iterator = keySet.iterator(); for (int n = 0; n < columnNum; n++) { XSSFCell cell = rowRowName.createCell(n); sheet.setColumnWidth(n, WIDTH); XSSFRichTextString text = new XSSFRichTextString(rowNames.get(iterator.next())); cell.setCellValue(text); cell.setCellStyle(columnTopStyle); } // 將查詢到的數據設置到sheet對應的單元格中 XSSFCellStyle style = getStyle(workbook); for (int i = 0; i < dataList.size(); i++) { T t = dataList.get(i); XSSFRow row = sheet.createRow(i + 3); Class<?> aClass = t.getClass(); int cellCount = 0; for (String s : keySet) { XSSFCell cell = row.createCell(cellCount); Field field = aClass.getDeclaredField(s); field.setAccessible(true); cell.setCellValue(field.get(t) == null ? "" : field.get(t).toString()); cell.setCellStyle(style); cellCount++; } } return workbook; } /** * 列頭單元格樣式 * @param workbook * @return */ public static XSSFCellStyle getColumnTopStyle(XSSFWorkbook workbook) { // 設置字體 XSSFFont font = workbook.createFont(); // 設置字體大小 font.setFontHeightInPoints((short) 11); // 字體加粗 font.setBold(true); // 設置字體名字 font.setFontName("Courier New"); // 設置樣式 XSSFCellStyle style = workbook.createCellStyle(); // 在樣式中應用設置的字體 style.setFont(font); // 設置自動換行 style.setWrapText(true); // 設置水平對齊的樣式爲居中對齊; style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); return style; } /** * 其餘列樣式 * @param workbook * @return */ public static XSSFCellStyle getStyle(XSSFWorkbook workbook) { // 設置字體 XSSFFont font = workbook.createFont(); // 設置字體大小 font.setFontHeightInPoints((short) 10); // 字體加粗 font.setBold(true); // 設置字體名字 font.setFontName("Courier New"); // 設置樣式; XSSFCellStyle style = workbook.createCellStyle(); // 在樣式用應用設置的字體; style.setFont(font); // 設置自動換行; style.setWrapText(true); // 設置水平對齊的樣式爲居中對齊; style.setAlignment(HorizontalAlignment.CENTER); // 設置垂直對齊的樣式爲居中對齊; style.setVerticalAlignment(VerticalAlignment.CENTER); return style; } }
實體類:
package com.jesse.dao.entity; /** * @author wpx * @date: 2019/10/21 */ public class ResubmitData { public ResubmitData(String enName, String name, String mobile, String classCode, String courseType, String resubmitPerson, String classTeacherName, String appealData, String reviewDate) { this.enName = enName; this.name = name; this.mobile = mobile; this.classCode = classCode; this.courseType = courseType; this.resubmitPerson = resubmitPerson; this.classTeacherName = classTeacherName; this.appealData = appealData; this.reviewDate = reviewDate; } /** * 學員英文名 */ private String enName; /** * 學員中文名 */ private String name; /** * 學員手機號 */ private String mobile; /** * 班級編號 */ private String classCode; /** * 課程類型 */ private String courseType; /** * 續報關係人 */ private String resubmitPerson; /** * 班級班主任 */ private String classTeacherName; /** * 是否爲申訴數據 */ private String appealData; /** * 審覈時間 */ private String reviewDate; public String getEnName() { return enName; } public void setEnName(String enName) { this.enName = enName; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getClassCode() { return classCode; } public void setClassCode(String classCode) { this.classCode = classCode; } public String getCourseType() { return courseType; } public void setCourseType(String courseType) { this.courseType = courseType; } public String getResubmitPerson() { return resubmitPerson; } public void setResubmitPerson(String resubmitPerson) { this.resubmitPerson = resubmitPerson; } public String getClassTeacherName() { return classTeacherName; } public void setClassTeacherName(String classTeacherName) { this.classTeacherName = classTeacherName; } public String getAppealData() { return appealData; } public void setAppealData(String appealData) { this.appealData = appealData; } public String getReviewDate() { return reviewDate; } public void setReviewDate(String reviewDate) { this.reviewDate = reviewDate; } @Override public String toString() { return super.toString(); } }
測試類:
public class PoiTest {
@Test public void test3() { String title = "續報數據列表"; //首行 LinkedHashMap<String, String> rowNames = new LinkedHashMap<>(); rowNames.put("enName", "學員英文名"); rowNames.put("name", "學員中文名"); rowNames.put("mobile", "學員手機號"); rowNames.put("classCode", "班級編號"); rowNames.put("courseType", "課程類型"); rowNames.put("resubmitPerson", "續報關係人"); rowNames.put("classTeacherName", "班級班主任"); rowNames.put("appealData", "是否爲申訴數據"); rowNames.put("reviewDate", "審覈時間"); List<ResubmitData> resubmitDatas = new ArrayList<>(); for (int i = 0 ; i < 5; i++) { String value = i + ""; ResubmitData resubmitData = new ResubmitData("123456789258656255165456456", value, value, value, value, value, value, value, null); resubmitDatas.add(resubmitData); } try { FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\wangp\\Desktop\\test.xlsx"); XSSFWorkbook export = ExportExcelUtil.export(title, rowNames, resubmitDatas); export.write(fileOutputStream); } catch (Exception e) { e.printStackTrace(); } }
}
結果爲: