package zj.excel.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.Serializable; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.log4j.Logger; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import zj.check.util.CheckUtil; import zj.date.util.DateUtil; import zj.excel.bean.ExcelI; import zj.excel.bean.ExcelTemplate; import zj.excel.bean.FormulaTemplate; import zj.excel.bean.WriteTemplateExcelI; import zj.io.util.FileUtil; import zj.java.bean.ZjIterator; import zj.java.util.JavaUtil; import zj.reflect.util.FieldUtil; import zj.regex.util.RegexUtil; import zj.type.TypeUtil; /** * 概況 :Excel/xls/xlsx<br> * * @version 1.00 (2011.12.02) * @author SHNKCS 張軍 {@link <a target=_blank href="http://www.shanghaijiadun.com">上海加盾信息科技有限公司</a> <a target=_blank href="http://m.eyofj.com">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>} <br> * * <br> * --------------------------讀取excel數據------------------------------<br> * * <pre> * try { * Excel readExcel = new Excel(); * readExcel.setFilePath("E:/document/zj-utils/excel/寫入excel" + "1" + ".xls"); * // readExcel.setSheetValue(new String[] { "Sheet1" }); * DatasKeySheets datasKeySheets = null; * // RE re = new RE(); * // datasKeySheets = ExcelUtil.readExcel(readExcel,re); * datasKeySheets = ExcelUtil.readExcel(readExcel); * List<SheetDatas> sheetDatas = datasKeySheets.getSheetDatas(); * for (SheetDatas datas : sheetDatas) { * // ======================= * System.out.println("sheet:" + datas.getSheetIndex() + "\t\t" + datas.getSheetName() + "\t\t" + datas.getSheet()); * // 循環sheet * // 獲取某個sheet的行列數據 * List<List<SheetData>> datasLst = datas.getRowsDataLst(); * if (datasLst != null) { * // 循環某個sheet的行數據 * for (List<SheetData> dataLst : datasLst) { * // 循環某個sheet的列數據 * for (SheetData data : dataLst) { * if (data != null) { * System.out.print(data.getValue() + "\t\t"); * } * } * System.out.println(); * } * } * } * } catch (Exception e) { * e.printStackTrace(); * } * </pre> * * <pre> * <br>------------------------------導出excel數據------------------------------<br> * try { * // 設置數據 * for (int ii = 0; ii < 10; ii++) { * List<SheetDatas> sheetDatas = new ArrayList<SheetDatas>(); * for (int k = 0; k < 10; k++) { * // 所有行列數據對象 * SheetDatas sheetData = new SheetDatas(); * sheetData.setSheetName("sheet名." + k); * sheetDatas.add(sheetData); * // 所有行數據 * List<List<SheetData>> rowsDataLst = new ArrayList<List<SheetData>>(); * // 設置所有行數據 * sheetData.setRowsDataLst(rowsDataLst); * // 所有列數據 * List<SheetData> columnsDataLst = null; * // 所有單元格數據 * SheetData data = null; * // 實例化所有行列數據 * for (int i = 0; i < 10000; i++) { * // 設置第i行數據 * columnsDataLst = new ArrayList<SheetData>(); * rowsDataLst.add(columnsDataLst); * // 添加第j行數據 * for (int j = 0; j < 10; j++) { * data = new SheetData(); * if (j == 5) { * data.setValue(i * j); * } else { * data.setValue("行" + i + "列" + j); * } * columnsDataLst.add(data); * } * } * } * // 導出excel設置 * Excel excel = new Excel(); * excel.setFilePath("E:/document/zj-utils/excel/寫入excel" + ii + ".xls"); * ExcelUtil.writeExcel(sheetDatas, excel); * } * } catch (Exception e) { * e.printStackTrace(); * } * </pre> */ public final class ExcelWriteUtil implements Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(ExcelWriteUtil.class.getName()); private ExcelWriteUtil() { } /** * 讀取excel * * @param excel * excel對象 * @return 所有行列數據對象 * @throws Exception */ public static final void writeTemplateExcel(final ExcelTemplate excel) throws Exception { writeTemplateExcel(excel, null); } /** * 讀取excel * * @param excel * excel對象 * @return 所有行列數據對象 * @throws Exception */ public static final synchronized void threadWriteTemplateExcel(final ExcelTemplate excel) throws Exception { threadWriteTemplateExcel(excel, null); } /** * 讀取excel * * @param excel * excel對象 * @param excelI * excelI接口 * @return 所有行列數據對象 * @throws Exception */ public static final void writeTemplateExcel(final ExcelTemplate excel, final ExcelI excelI) throws Exception { final long start = System.currentTimeMillis(); Set<Sheet> sheets = ExcelReadUtil.readSheets(excel); writeTemplateSheet(excel, excelI, start, sheets); } /** * 讀取excel * * @param excel * excel對象 * @param excelI * excelI接口 * @return 所有行列數據對象 * @throws Exception */ public static final synchronized void threadWriteTemplateExcel(final ExcelTemplate excel, final ExcelI excelI) throws Exception { final long start = System.currentTimeMillis(); Set<Sheet> sheets = ExcelReadUtil.readSheets(excel); threadWriteSheet(excel, excelI, start, sheets); } /** * 非線程寫入 * * @param excel * @param excelI * @param start * @param wb * @param sheets * @throws Exception */ private static void writeTemplateSheet(final ExcelTemplate excel, final ExcelI excelI, final long start, Set<Sheet> sheets) throws Exception { if (sheets.size() > 0) { // boolean writeFile = false; // for (Sheet tempSheet : sheets) { // boolean tempWriteFile = writeTemplateSheet(tempSheet, excel, excelI); // if (!writeFile) { // writeFile = tempWriteFile; // } // } // if (writeFile) { // writeFile(excel); // } else { // logger.debug("未找到模板內容與傳入內容表達式關系"); // } for (Sheet tempSheet : sheets) { // 強制執行excel公式 tempSheet.setForceFormulaRecalculation(true); writeTemplateSheet(tempSheet, excel, excelI); try { List<Map<ConstantForEnum.MergedRegionKey, Integer>> mergedRegions = excel.mergerRegionsMap.get(tempSheet.getSheetName()); if (mergedRegions != null) { for (Map<ConstantForEnum.MergedRegionKey, Integer> mergedRegionMap : mergedRegions) { Integer firstR = -1; Integer lastR = -1; Integer firstC = -1; Integer lastC = -1; String errorArea = "區域行[" + firstR + "-" + lastR + "]列[" + firstC + "-" + lastC + "]"; try { firstR = mergedRegionMap.get(ConstantForEnum.MergedRegionKey.FIRSTR); lastR = mergedRegionMap.get(ConstantForEnum.MergedRegionKey.LASTR); firstC = mergedRegionMap.get(ConstantForEnum.MergedRegionKey.FIRSTC); lastC = mergedRegionMap.get(ConstantForEnum.MergedRegionKey.LASTC); errorArea = "區域行[" + firstR + "-" + lastR + "]列[" + firstC + "-" + lastC + "]"; if (firstR == null || lastR == null || firstC == null || lastC == null || firstR < 0 || lastR < 0 || firstC < 0 || lastC < 0) { // 合并下個區域 logger.warn("合并" + errorArea + "參數設置有誤:" + mergedRegionMap.entrySet()); continue; } // 循環區域開始合并 ExcelUtil.mergerRegion(tempSheet, firstR, lastR, firstC, lastC); } catch (Exception e) { logger.error("合并" + errorArea + "出錯,繼續合并下個區域單元格", e); } } } } catch (Exception e1) { logger.error("合并單元格時出錯", e1); } // 改變sheet樣式 // // 生成一個字體 // for (int i = 2; i < 6; i ++){ // try { // Font font = excel.getWb().createFont(); // font.setColor(HSSFColor.RED.index);// HSSFColor.VIOLET.index //字體顏色 // // 把字體應用到當前的樣式 // CellStyle nStyle = excel.getWb().createCellStyle(); // Cell cell = tempSheet.getRow(i).getCell(2); // CellStyle oStyle = cell.getCellStyle(); // // nStyle.cloneStyleFrom(oStyle); // // nStyle.setFont(font); // // cell.setCellStyle(nStyle); // oStyle.setFont(font); // cell.setCellStyle(oStyle); // } catch (Exception e) { // e.printStackTrace(); // } // } // 生成一個字體 try { if (excelI instanceof WriteTemplateExcelI) { ((WriteTemplateExcelI) excelI).afterService(tempSheet, excel.jsonParamsMap.get(tempSheet.getSheetName())); } } catch (Exception e) { logger.error("回調后處理時出錯", e); } } if (excel.isAutoWriteExcel()) { writeTemplateFile(excel); } } final long end = System.currentTimeMillis(); final long x = (end - start) / 1000; final long y = (end - start) % 1000; logger.warn("根據excel模板導出執行時間:" + (end - start) + "毫秒;" + x + "." + (y < 100 ? "0" + y : y) + "秒"); } /** * 線程寫入 * * @param excel * @param excelI * @param start * @param wb * @param sheets */ private static void threadWriteSheet(final ExcelTemplate excel, final ExcelI excelI, final long start, Set<Sheet> sheets) { if (sheets.size() > 0) { final Workbook wb = excel.getWb(); List<Sheet> removeSheets = new ArrayList<Sheet>(); // 刪除無用的sheet for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { // 獲得sheet工作簿Sheet Sheet sheet = wb.getSheetAt(sheetIndex); if (!sheets.contains(sheet)) { removeSheets.add(sheet); } } for (Sheet removeSheet : removeSheets) { wb.removeSheetAt(wb.getSheetIndex(removeSheet)); } final ExecutorService ee = Executors.newCachedThreadPool(); final CountDownLatch latch = new CountDownLatch(sheets.size()); for (final Sheet tempSheet : sheets) { ee.execute(new Runnable() { @Override public void run() { try { writeTemplateSheet(tempSheet, excel, excelI); } catch (Exception e) { e.printStackTrace(); } // try { // TimeUnit.SECONDS.sleep(new Random().nextInt(1)); // } catch (InterruptedException e1) { // e1.printStackTrace(); // } latch.countDown(); // boolean tempWriteFile = writeTemplateSheet(tempSheet, excel, excelI); // if (!writeFile) { // writeFile = tempWriteFile; // } } }); } ee.execute(new Runnable() { @Override public void run() { try { latch.await(); } catch (InterruptedException e1) { e1.printStackTrace(); } try { if (excel.isAutoWriteExcel()) { writeTemplateFile(excel); } } catch (Exception e) { e.printStackTrace(); } long end = System.currentTimeMillis(); long x = (end - start) / 1000; long y = (end - start) % 1000; logger.warn("根據excel模板導出執行時間:" + (end - start) + "毫秒;" + x + "." + (y < 100 ? "0" + y : y) + "秒"); } }); ee.shutdown(); } } /** * 讀取sheet行列集合 * * @param sheet * @param excel * @param excelI * @throws Exception */ @SuppressWarnings("unchecked") public static final synchronized boolean writeTemplateSheet(final Sheet sheet, final ExcelTemplate excel, final ExcelI excelI) throws Exception { // 設置寫文件狀態:true[寫],false[不寫] boolean writeFile = false; Set<String> nameCollKeys = new HashSet<String>(); WriteTemplateExcelI wTemplateExcelI = null; if (excelI != null) { wTemplateExcelI = (WriteTemplateExcelI) excelI; } int endRowIndex = wTemplateExcelI == null ? ExcelI.END_ROW_INDEX : wTemplateExcelI.getEndRowIndex(); int endColumnIndex = wTemplateExcelI == null ? ExcelI.END_COLUMN_INDEX : wTemplateExcelI.getEndColumnIndex(); // 獲得sheet總行數 // 循環sheet中的所有行數據 for (int rowIndex = wTemplateExcelI == null ? ExcelI.START_ROW_INDEX : wTemplateExcelI.getStartRowIndex(); rowIndex <= sheet.getLastRowNum(); rowIndex++) { // 是否結束 if (endRowIndex != -1 && rowIndex > endRowIndex) break; if (wTemplateExcelI != null && wTemplateExcelI.filterRow(sheet, rowIndex)) { // ("sheetName:" + sheet.getSheetName() + ",第" + rowIndex + "行數據已被過慮"); continue; } // 行數據 // 獲得行對象 Row row = sheet.getRow(rowIndex); if (null != row) { // 獲得本行中單元格的個數 // 遍歷列cell for (int columnIndex = wTemplateExcelI == null ? 0 : wTemplateExcelI.getStartColumnIndex(); columnIndex < row.getLastCellNum(); columnIndex++) { // 是否結束 if (endColumnIndex != -1 && columnIndex > endColumnIndex) break; Cell cell = row.getCell(columnIndex); // 獲得指定單元格中的數據 Object value = ExcelReadUtil.readCellString(cell); // 如果未實現,則取默認值 value = wTemplateExcelI == null ? value : wTemplateExcelI.readValue(sheet, rowIndex, columnIndex, value); if (value instanceof String) { // 只獲取String的字符串 String svalue = ""; // 取得表達式串 Map<String, String> valueMap = RegexUtil.fillString(svalue = JavaUtil.objToStr(value)); // 取得所有占位符名 String names = valueMap.get(RegexUtil.FillString.KEY_PLACEHOLDER_NAMES); if (CheckUtil.isNotNull(names)) { // 取得占位符 String places = valueMap.get(RegexUtil.FillString.KEY_PLACEHOLDER); // 如果不是單純的表達式,例如:其它字符+表達式,則可能是日期格式,數字,或其它格式,需要格式化 boolean isOne = svalue.equals(places); // 多個占位符數組 String[] nameAry = names.split(RegexUtil.FillString.KEY_PLACEHOLDER_NAMES_SPLIT); if (nameAry.length > 0) { // 循環所有占位符名 for (String name : nameAry) { if ("".equals(name)) { continue; } // 記錄索引 int index = -1; if ((index = name.indexOf(".")) == -1) { // 根據占位符取得占位符值 Object ovalue = excel.getNameValueMap().get(name); if (ovalue instanceof FormulaTemplate) { // 如果是公式 FormulaTemplate ft = (FormulaTemplate) ovalue; // 改變單元格值 ExcelUtil.setCellValue(sheet, row, cell, rowIndex, columnIndex, ovalue, null); // 賦值改變后的值 svalue = ft.value; // 設置寫文件狀態 writeFile = true; } else if (ovalue instanceof Collection || ovalue instanceof Object[]) { // 復制列 // 如果值是集合對象 ZjIterator baseColl = ZjIterator.newIterator(ovalue); int tempRowCount = baseColl.size(); if (tempRowCount > 0) { boolean isRowColData = false; Object firstObj = baseColl.next(); baseColl.reset(); isRowColData = firstObj instanceof Collection || firstObj instanceof Object[]; if (isRowColData) { int tempRowIdx = rowIndex; // 處理行列數據 // 添加新行時拷貝原有值(默認) ExcelUtil.insertRows(excel, sheet, tempRowIdx, tempRowCount - 1, excel.isCopyDefaultValue()); // 循環賦值 for (Object objCol : baseColl) { // 如果值是集合對象 ZjIterator collValue = ZjIterator.newIterator(objCol); // 如果值是集合對象 Row rowTemp = sheet.getRow(tempRowIdx); if (rowTemp == null) { // 如果不存在,則實例化 rowTemp = sheet.createRow(tempRowIdx); } int tempColIdx = columnIndex; for (Object cellValue : collValue) { // 獲取當前單元格式列 Cell cellTemp = rowTemp.getCell(tempColIdx); if (cellTemp == null) { // 如果不存在,則實例化 cellTemp = rowTemp.createCell(tempColIdx); } // 復制單元格 ExcelUtil.copyCell(excel, cell, cellTemp, false, true, true); // 設置值 ExcelUtil.setCellValue(sheet, rowTemp, cellTemp, tempRowIdx, tempColIdx, cellValue, null); tempColIdx++; } tempRowIdx++; } } else { int tempRowIdx = rowIndex; int tempColIdx = columnIndex; for (Object objCol : baseColl) { // 獲取當前單元格式列 Cell cellTemp = row.getCell(tempColIdx); if (cellTemp == null) { // 如果不存在,則實例化 cellTemp = row.createCell(tempColIdx); } // 復制單元格 ExcelUtil.copyCell(excel, cell, cellTemp, false, true, true); // 設置值 ExcelUtil.setCellValue(sheet, row, cellTemp, tempRowIdx, tempColIdx, objCol, null); tempColIdx++; } } // 設置寫文件狀態 writeFile = true; } } else { String placeValue = JavaUtil.objToStr(ovalue); Object newObjValue = null; if (!excel.getNameValueMap().containsKey(name) && CheckUtil.isNull(placeValue)) { // 通過name取值 if (wTemplateExcelI == null) { // 如果沒有實現,則繼續下個單元格 continue; } try { newObjValue = wTemplateExcelI.readTemplateValue(sheet, rowIndex, columnIndex, name); } catch (Exception e) { // 如果拋出異常,則繼續下個單元格 continue; } } else { // 實例替換占位符值的集體 Map<String, String> sNameValueMapTemp = new HashMap<String, String>(); // 設置占位符名對應的占位符值 sNameValueMapTemp.put(name, placeValue); // 獲取替換結果 Map<String, String> resultNameValueMap = RegexUtil.fillString(svalue, sNameValueMapTemp); // 獲取替換后的字符串 String newValue = resultNameValueMap.get(RegexUtil.FillString.KEY_NEW_VALUE); if (placeValue.equals(newValue)) { newObjValue = ovalue; } else { newObjValue = newValue; } // 賦值改變后的值 svalue = newValue; } // 改變單元格值 ExcelUtil.setCellValue(sheet, row, cell, rowIndex, columnIndex, newObjValue, null); // 設置寫文件狀態 writeFile = true; } } else { int firstC = 0; int lastC = 0; int firstR = 0; int lastR = 0; int flr = 0; // 取得占位符前綴 String prefixName = name.substring(0, index); // 取得屬性名 String propertyName = name.substring(index + 1); // 獲取集合引用對象 String nameKey = excel.getCollectionKey(prefixName); // 取得nameKey對應的集合數據 Object nameObj = excel.getNameValueMap().get(nameKey); if (nameObj != null) { // 是否是合并單元格 boolean isMerged = false; // 設置臨時行變量 int rowIndexTemp = rowIndex; // 獲取合并的單元格 CellRangeAddress ca = ExcelReadUtil.readMergedRegion(sheet, rowIndex, columnIndex); if (ca != null) { // 獲得合并單元格的起始行, 結束行, 起始列, 結束列, 行數 firstC = ca.getFirstColumn(); lastC = ca.getLastColumn(); firstR = ca.getFirstRow(); lastR = ca.getLastRow(); isMerged = true; flr = lastR - firstR; } if (nameObj instanceof Collection) { // 如果值是集合對象 Collection<Object> coll = (Collection<Object>) nameObj; if (coll != null && coll.size() > 0) { // 設置此屬性是否是插入行 String sAutoInsertRows = excel.getPropertyKey(prefixName, ExcelTemplate.PROPERTY_AUTO_INSERT_ROWS); boolean autoInsertRows = true; if (CheckUtil.isNotNull(sAutoInsertRows)) { Object oAutoInsertRows = excel.getNameValueMap().get(sAutoInsertRows); if (oAutoInsertRows != null) { autoInsertRows = TypeUtil.Primitive.booleanValue(oAutoInsertRows); } } if (autoInsertRows) { String nameCollKey = nameKey + ":" + rowIndex; // 判斷只插入一次新行(循環所有的行數據) if (!nameCollKeys.contains(nameCollKey)) { // 添加新行時拷貝原有值(默認) ExcelUtil.insertRows(excel, sheet, rowIndex, coll.size() - 1, excel.isCopyDefaultValue()); nameCollKeys.add(nameCollKey); } } String tempSvalue = svalue; int collIndex = 0; int collSize = coll.size(); // 如果存在 int firstIndex = 1; for (Object obj : coll) { // 循環所有行數據 // 獲取當前單元格式行 Row rowTemp = sheet.getRow(rowIndexTemp); if (rowTemp == null) { // 如果不存在,則實例化 rowTemp = sheet.createRow(rowIndexTemp); } // 獲取當前單元格式列 Cell cellTemp = rowTemp.getCell(columnIndex); if (cellTemp == null) { // 如果不存在,則實例化 cellTemp = rowTemp.createCell(columnIndex); } // 復制單元格 ExcelUtil.copyCell(excel, cell, cellTemp, false, true, true); // 取得屬性值 Object fieldObjValue = null; try { if (obj instanceof Map) { Map<String, Object> objMap = (Map<String, Object>) obj; fieldObjValue = objMap.get(propertyName); } else { fieldObjValue = FieldUtil.get(obj, propertyName, true); } } catch (Exception e) { fieldObjValue = ""; logger.error("獲取對象值異常,默認空", e); } if (isOne) { } else { // 非String String convertStr = ""; try { if (fieldObjValue instanceof String) { convertStr = JavaUtil.objToStr(fieldObjValue); } else if (fieldObjValue instanceof Date || fieldObjValue instanceof Calendar || fieldObjValue instanceof Timestamp) { convertStr = DateUtil.dateParse(fieldObjValue, "yyyy-MM-dd HH:mm:ss"); // 日期格式化成字符串 } else if (fieldObjValue instanceof Boolean) { convertStr = JavaUtil.objToStr(fieldObjValue); } else if (fieldObjValue instanceof Number) { // 數字 convertStr = JavaUtil.objToStr(fieldObjValue); } else { convertStr = JavaUtil.objToStr(fieldObjValue); } } catch (Exception e) { convertStr = ""; logger.error("轉換值出錯,默認空", e); } // 如果值是String類型 // 實例替換占位符值的集體 Map<String, String> sNameValueMapTemp = new HashMap<String, String>(); // 設置占位符名對應的占位符值 sNameValueMapTemp.put(name, convertStr); // 獲取替換結果 Map<String, String> resultNameValueMap = RegexUtil.fillString(tempSvalue, sNameValueMapTemp); // 獲取替換后的字符串 fieldObjValue = resultNameValueMap.get(RegexUtil.FillString.KEY_NEW_VALUE); if (firstIndex == 1) { firstIndex++; // 賦值改變后的值 svalue = JavaUtil.objToStr(fieldObjValue); } } // 是否根據目標單元格類型轉換值 // if (excel.isAutoConvertValue()) { // fieldObjValue = ExcelUtil.convertValueByDestCell(cellTemp, fieldObjValue); // } ExcelUtil.setCellValue(sheet, rowTemp, cellTemp, rowIndexTemp, columnIndex, fieldObjValue, null); if (isMerged) { // XXX 復制合并單元格(需要改) for (int r = firstR; r <= lastR; r++) { // 獲取當前單元格式行 Row rowTempStyle = sheet.getRow(r); if (rowTempStyle == null) { // 如果不存在,則實例化 rowTempStyle = sheet.createRow(r); } for (int c = firstC; c <= lastC; c++) { // 獲取當前單元格式列 Cell cellTempStyle = rowTempStyle.getCell(c); if (cellTempStyle == null) { // 如果不存在,則實例化 cellTempStyle = rowTempStyle.createCell(c); } ExcelUtil.copyCell(excel, cell, cellTempStyle, false, true, true); // ExcelUtil.copyCellStyle(cell.getCellStyle(), cellTempStyle.getCellStyle()); } } } if (collIndex < collSize - 1) { // 如果最后一條數據,則無需合并單元格 if (isMerged) { // 行循環 // 繼續下一行 firstR = lastR + 1; lastR = firstR + flr; // 合并單元格 ExcelUtil.mergerRegion(sheet, firstR, lastR, firstC, lastC); rowIndexTemp = firstR; } else { // 繼續下一行 rowIndexTemp++; } } collIndex++; } // 設置寫文件狀態 writeFile = true; } else { ExcelUtil.setCellValue(sheet, row, cell, rowIndex, columnIndex, null, null); // 設置寫文件狀態 writeFile = true; } } } } } } } } } } } return writeFile; } /** * 寫文件 */ public static final void writeTemplateFile(final ExcelTemplate excel) throws Exception { Workbook wb = excel.getWb(); try { List<Sheet> removeSheets = new ArrayList<Sheet>(); // for (String name : excel.addedSheets) { // System.out.println(name); // } // System.out.println("=================="); // for (String name : excel.templateSheets) { // System.out.println(name); // } // System.out.println("---------------------"); // 刪除無用的sheet if (excel.isRemoveOtherSheets()) { for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { // 獲得sheet工作簿Sheet Sheet sheet = wb.getSheetAt(sheetIndex); String name = sheet.getSheetName(); // 除了模板和新增sheet,其它全部移除 if (!(excel.addedSheets.contains(name) || excel.templateSheets.contains(name))) { removeSheets.add(sheet); } } for (Sheet removeSheet : removeSheets) { // System.out.println(removeSheet.getSheetName()); // 刪除其它sheet及模板sheet wb.removeSheetAt(wb.getSheetIndex(removeSheet)); } } if (excel.isRemoveTemplatesSheets()) { // 移除模板sheet for (String name : excel.templateSheets) { Sheet removeSheet = wb.getSheet(name); // System.out.println(removeSheet.getSheetName()); wb.removeSheetAt(wb.getSheetIndex(removeSheet)); } } } catch (Exception e) { e.printStackTrace(); } BufferedOutputStream bos = null; try { String[] paths = FileUtil.getFileNameExtension(excel.getReFilePath()); File file = null; if ("false".equals(paths[3])) { // 文件夾 file = new File(paths[0]); if (!file.exists()) { file.mkdirs(); } } // 文件 file = new File(paths[0] + paths[1] + paths[2]); bos = new BufferedOutputStream(new FileOutputStream(file)); // 設置默認活動的sheet為第一個 // wb.setSelectedTab(0); wb.setActiveSheet(0); wb.write(bos); bos.flush(); // logger.debug("寫入模板文件成功"); } finally { if (bos != null) { bos.close(); } if (wb != null) { wb.close(); wb = null; } } } }
本文為張軍原創文章,轉載無需和我聯系,但請注明來自張軍的軍軍小站,個人博客http://m.eyofj.com
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
