亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Excel寫工具類

張軍 2604 0
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>&nbsp;&nbsp;&nbsp;&nbsp;<a target=_blank href="http://m.eyofj.com">張軍個人網站</a>&nbsp;&nbsp;&nbsp;&nbsp;<a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>} <br>
 *         * <br>
 *         --------------------------讀取excel數據------------------------------<br>
 * 
 *         <pre>
 * try {
 * 	Excel readExcel = new Excel();
 * 	readExcel.setFilePath(&quot;E:/document/zj-utils/excel/寫入excel&quot; + &quot;1&quot; + &quot;.xls&quot;);
 * 	// readExcel.setSheetValue(new String[] { &quot;Sheet1&quot; });
 * 	DatasKeySheets datasKeySheets = null;
 * 	// RE re = new RE();
 * 	// datasKeySheets = ExcelUtil.readExcel(readExcel,re);
 * 	datasKeySheets = ExcelUtil.readExcel(readExcel);
 * 	List&lt;SheetDatas&gt; sheetDatas = datasKeySheets.getSheetDatas();
 * 	for (SheetDatas datas : sheetDatas) {
 * 		// =======================
 * 		System.out.println(&quot;sheet:&quot; + datas.getSheetIndex() + &quot;\t\t&quot; + datas.getSheetName() + &quot;\t\t&quot; + datas.getSheet());
 * 		// 循環sheet
 * 		// 獲取某個sheet的行列數據
 * 		List&lt;List&lt;SheetData&gt;&gt; datasLst = datas.getRowsDataLst();
 * 		if (datasLst != null) {
 * 			// 循環某個sheet的行數據
 * 			for (List&lt;SheetData&gt; dataLst : datasLst) {
 * 				// 循環某個sheet的列數據
 * 				for (SheetData data : dataLst) {
 * 					if (data != null) {
 * 						System.out.print(data.getValue() + &quot;\t\t&quot;);
 * 					}
 * 				}
 * 				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;
			}
		}
	}
}



更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人欧美在线视频 | 国产精品久久久久久久久免费观看 | 成人青草亚洲国产 | 一区二区三区视频 | 最新日韩在线 | 国产精品成人一区二区三区 | 在线观看色 | 三级大黄| 99爱视频| 久久精品99精品免费观看 | 高清国产一区 | 天啪天干在线视频 | 久久精品免视看国产成人2021 | 婷婷久久精品 | 国产亚洲第一伦理第一区 | 亚洲区精品久久一区二区三区 | 欧美一级免费观看 | 日本一级高清不卡视频在线 | 久久国产精品ww | 欧美毛片在线 | a大片久久爱一级 | 国产精品欧美韩国日本久久 | 农村苗族一级特黄a大片 | 宅男看片午夜大片啪啪mv | 国产成人看片免费视频观看 | 亚洲精品视频免费看 | 美女福利在线观看 | 亚洲欧美另类国产 | 一级做a爱片特黄在线观看免费看 | 国内精品哆啪啪 | 欧美亚洲动漫 | 亚洲第九十七页 | 成人欧美精品久久久久影院 | 91最新在线视频 | 日本三级日本三级人妇三级四 | 天天射天天操天天色 | 欧美成人精品免费播放 | 亚洲精品你懂的 | 奇米线在人线免费视频 | 午夜黄色毛片 | 国产成人精品视频一区二区不卡 |