import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.*; public class WriterExcelUtil { private static final Logger LOGGER = LoggerFactory.getLogger(WriterExcelUtil.class.getName()); public static void main(String[] args) { String path = "E://demo.xlsx"; String name = "test"; List<String> titles =Lists.newArrayList(); titles.add("id"); titles.add("name"); titles.add("age"); titles.add("birthday"); titles.add("gender"); titles.add("date"); List<Map<String, Object>> values = Lists.newArrayList(); for (int i = 0; i < 10; i++) { Map<String, Object> map = Maps.newHashMap(); map.put("id", i + 1D); map.put("name", "test_" + i); map.put("age", i * 1.5); map.put("gender", "man"); map.put("birthday", new Date()); map.put("date", Calendar.getInstance()); values.add(map); } System.out.println(writerExcel(path, name, titles, values)); } /** * 數據寫入Excel文件 * * @param path 文件路徑,包含文件全名,例如:D://file//demo.xls * @param name sheet名稱 * @param titles 行標題列 * @param values 數據集合,key爲標題,value爲數據 * @return True\False */ public static boolean writerExcel(String path, String name, List<String> titles, List<Map<String, Object>> values) { LOGGER.info("path : {}", path); String style = path.substring(path.lastIndexOf("."), path.length()).toUpperCase(); // 從文件路徑中獲取文件的類型 return generateWorkbook(path, name, style, titles, values); } /** * 將數據寫入指定path下的Excel文件中 * * @param path 文件存儲路徑 * @param name sheet名 * @param style Excel類型 * @param titles 標題串 * @param values 內容集 * @return True\False */ private static boolean generateWorkbook(String path, String name, String style, List<String> titles, List<Map<String, Object>> values) { LOGGER.info("file style : {}", style); Workbook workbook; if ("XLS".equals(style.toUpperCase())) { workbook = new HSSFWorkbook(); } else { workbook = new XSSFWorkbook(); } // 生成一個表格 Sheet sheet; if (null == name || "".equals(name)) { sheet = workbook.createSheet(); // name 爲空則使用默認值 } else { sheet = workbook.createSheet(name); } // 設置表格默認列寬度爲15個字節 sheet.setDefaultColumnWidth((short) 15); // 生成樣式 Map<String, CellStyle> styles = createStyles(workbook); /* * 建立標題行 */ Row row = sheet.createRow(0); // 存儲標題在Excel文件中的序號 Map<String, Integer> titleOrder = Maps.newHashMap(); for (int i = 0; i < titles.size(); i++) { Cell cell = row.createCell(i); cell.setCellStyle(styles.get("header")); String title = titles.get(i); cell.setCellValue(title); titleOrder.put(title, i); } /* * 寫入正文 */ Iterator<Map<String, Object>> iterator = values.iterator(); int index = 0; // 行號 while (iterator.hasNext()) { index++; // 出去標題行,從第一行開始寫 row = sheet.createRow(index); Map<String, Object> value = iterator.next(); for (Map.Entry<String, Object> map : value.entrySet()) { // 獲取列名 String title = map.getKey(); // 根據列名獲取序號 int i = titleOrder.get(title); // 在指定序號處建立cell Cell cell = row.createCell(i); // 設置cell的樣式 if (index % 2 == 1) { cell.setCellStyle(styles.get("cellA")); } else { cell.setCellStyle(styles.get("cellB")); } // 獲取列的值 Object object = map.getValue(); // 判斷object的類型 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (object instanceof Double) { cell.setCellValue((Double) object); } else if (object instanceof Date) { String time = simpleDateFormat.format((Date) object); cell.setCellValue(time); } else if (object instanceof Calendar) { Calendar calendar = (Calendar) object; String time = simpleDateFormat.format(calendar.getTime()); cell.setCellValue(time); } else if (object instanceof Boolean) { cell.setCellValue((Boolean) object); } else { cell.setCellValue(object.toString()); } } } /* * 寫入到文件中 */ boolean isCorrect = false; try { File file = new File(path); OutputStream outputStream = new FileOutputStream(file); workbook.write(outputStream); outputStream.close(); isCorrect = true; } catch (IOException e) { isCorrect = false; LOGGER.error("write Excel file error : {}", e.getMessage()); } try { workbook.close(); } catch (IOException e) { isCorrect = false; LOGGER.error("workbook closed error : {}", e.getMessage()); } return isCorrect; } /** * Create a library of cell styles */ /** * @param wb * @return */ private static Map<String, CellStyle> createStyles(Workbook wb) { Map<String, CellStyle> styles = Maps.newHashMap(); // 標題樣式 CellStyle titleStyle = wb.createCellStyle(); titleStyle.setAlignment(HorizontalAlignment.CENTER); // 水平對齊 titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直對齊 titleStyle.setLocked(true); // 樣式鎖定 titleStyle.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex()); Font titleFont = wb.createFont(); titleFont.setFontHeightInPoints((short) 16); titleFont.setBold(true); titleFont.setFontName("微軟雅黑"); titleStyle.setFont(titleFont); styles.put("title", titleStyle); // 文件頭樣式 CellStyle headerStyle = wb.createCellStyle(); headerStyle.setAlignment(HorizontalAlignment.CENTER); headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); // 前景色 headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 顏色填充方式 headerStyle.setWrapText(true); headerStyle.setBorderRight(BorderStyle.THIN); // 設置邊界 headerStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); headerStyle.setBorderLeft(BorderStyle.THIN); headerStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); headerStyle.setBorderTop(BorderStyle.THIN); headerStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); headerStyle.setBorderBottom(BorderStyle.THIN); headerStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); Font headerFont = wb.createFont(); headerFont.setFontHeightInPoints((short) 12); headerFont.setColor(IndexedColors.WHITE.getIndex()); titleFont.setFontName("微軟雅黑"); headerStyle.setFont(headerFont); styles.put("header", headerStyle); Font cellStyleFont = wb.createFont(); cellStyleFont.setFontHeightInPoints((short) 12); cellStyleFont.setColor(IndexedColors.BLUE_GREY.getIndex()); cellStyleFont.setFontName("微軟雅黑"); // 正文樣式A CellStyle cellStyleA = wb.createCellStyle(); cellStyleA.setAlignment(HorizontalAlignment.CENTER); // 居中設置 cellStyleA.setVerticalAlignment(VerticalAlignment.CENTER); cellStyleA.setWrapText(true); cellStyleA.setBorderRight(BorderStyle.THIN); cellStyleA.setRightBorderColor(IndexedColors.BLACK.getIndex()); cellStyleA.setBorderLeft(BorderStyle.THIN); cellStyleA.setLeftBorderColor(IndexedColors.BLACK.getIndex()); cellStyleA.setBorderTop(BorderStyle.THIN); cellStyleA.setTopBorderColor(IndexedColors.BLACK.getIndex()); cellStyleA.setBorderBottom(BorderStyle.THIN); cellStyleA.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellStyleA.setFont(cellStyleFont); styles.put("cellA", cellStyleA); // 正文樣式B:添加前景色爲淺黃色 CellStyle cellStyleB = wb.createCellStyle(); cellStyleB.setAlignment(HorizontalAlignment.CENTER); cellStyleB.setVerticalAlignment(VerticalAlignment.CENTER); cellStyleB.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex()); cellStyleB.setFillPattern(FillPatternType.SOLID_FOREGROUND); cellStyleB.setWrapText(true); cellStyleB.setBorderRight(BorderStyle.THIN); cellStyleB.setRightBorderColor(IndexedColors.BLACK.getIndex()); cellStyleB.setBorderLeft(BorderStyle.THIN); cellStyleB.setLeftBorderColor(IndexedColors.BLACK.getIndex()); cellStyleB.setBorderTop(BorderStyle.THIN); cellStyleB.setTopBorderColor(IndexedColors.BLACK.getIndex()); cellStyleB.setBorderBottom(BorderStyle.THIN); cellStyleB.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellStyleB.setFont(cellStyleFont); styles.put("cellB", cellStyleB); return styles; } }