ExcelUtil.java
1 package pers.kangxu.datautils.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.Iterator; 11 import java.util.List; 12 import java.util.Map; 13 14 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 15 import org.apache.poi.hssf.usermodel.HSSFFont; 16 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 17 import org.apache.poi.ss.usermodel.Cell; 18 import org.apache.poi.ss.usermodel.CellStyle; 19 import org.apache.poi.ss.usermodel.CellValue; 20 import org.apache.poi.ss.usermodel.Font; 21 import org.apache.poi.ss.usermodel.FormulaEvaluator; 22 import org.apache.poi.ss.usermodel.Row; 23 import org.apache.poi.ss.usermodel.Sheet; 24 import org.apache.poi.ss.usermodel.Workbook; 25 import org.apache.poi.ss.util.CellRangeAddress; 26 27 /** 28 * 29 * <b> 30 * excel 工具 31 * </b> 32 * @author kangxu 33 * 34 */ 35 public class ExcelUtil { 36 37 /** 38 * 導出 excel 39 * @param filePath 文件全路徑 40 * @param sheetName sheet頁名稱 41 * @param sheetIndex 當前sheet下表 從0開始 42 * @param fileHeader 頭部 43 * @param datas 內容 44 */ 45 public static void writeExcel(String filePath,String sheetName, 46 int sheetIndex, 47 String[] fileHeader, 48 List<String[]> datas){ 49 // 創建工作簿 50 Workbook wb = new HSSFWorkbook(); 51 // 創建工作表 sheet 52 Sheet s = wb.createSheet(); 53 54 wb.setSheetName(sheetIndex, sheetName); 55 56 Row r = s.createRow(0); 57 Cell c = null; 58 Font font = null; 59 CellStyle styleHeader = null; 60 CellStyle styleContent = null; 61 62 63 //粗體 64 font = wb.createFont(); 65 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 66 // 設置頭樣式 67 styleHeader = wb.createCellStyle(); 68 styleHeader.setFont(font); 69 styleHeader.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下邊框 70 styleHeader.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左邊框 71 styleHeader.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框 72 styleHeader.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框 73 // 設置內容樣式 74 styleContent = wb.createCellStyle(); 75 styleContent.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下邊框 76 styleContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左邊框 77 styleContent.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框 78 styleContent.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框 79 80 81 //設置頭 82 for(int i=0;i<fileHeader.length;){ 83 c = r.createCell(i); 84 c.setCellStyle(styleHeader); 85 c.setCellValue(fileHeader[i]); 86 i++; 87 } 88 89 //設置內容 90 for(int rownum=0;rownum<datas.size();){ // 行 row datas.size() 91 r = s.createRow(rownum+1); //創建行 92 for(int cellnum=0;cellnum<fileHeader.length;){ 93 c = r.createCell(cellnum); 94 95 c.setCellValue(datas.get(rownum)[cellnum]); 96 c.setCellStyle(styleContent); 97 cellnum++; 98 } 99 100 rownum++; 101 } 102 103 FileOutputStream out = null; 104 try { 105 // 創建文件或者文件夾,將內容寫進去 106 if(FileUtil.createFile(new File(filePath))){ 107 out = new FileOutputStream(filePath); 108 wb.write(out); 109 } 110 111 } catch (Exception e) { 112 e.printStackTrace(); 113 }finally { 114 try { 115 // 關閉流 116 if(out != null){ 117 out.flush(); 118 out.close(); 119 } 120 } catch (IOException e) { 121 e.printStackTrace(); 122 } 123 } 124 125 } 126 127 /** 128 * 讀取 excel 文件內容 129 * @param filePath 130 * @param sheetIndex 131 */ 132 public static List<Map<String,String>> readExcel(String filePath,int sheetIndex){ 133 List<Map<String,String>> mapList = new ArrayList<Map<String,String>>(); 134 // 頭 135 List<String> list = new ArrayList<String>(); 136 // 137 138 int cnt = 0; 139 int idx = 0; 140 141 try { 142 InputStream input = new FileInputStream(filePath); //建立輸入流 143 Workbook wb = null; 144 145 wb = new HSSFWorkbook(input); 146 147 // 獲取sheet頁 148 Sheet sheet = wb.getSheetAt(sheetIndex); 149 150 Iterator<Row> rows = sheet.rowIterator(); 151 while (rows.hasNext()) { 152 Row row = rows.next(); 153 Iterator<Cell> cells = row.cellIterator(); 154 155 Map<String,String> map = new HashMap<String,String>(); 156 157 if(cnt == 0){ // 將頭放進list中 158 while (cells.hasNext()) { 159 Cell cell = cells.next(); 160 if(isContainMergeCell(sheet)){ 161 cancelMergeCell(sheet); 162 } 163 list.add(getStringCellValue(cell)); 164 } 165 cnt ++; 166 continue; 167 168 }else { 169 while (cells.hasNext()) { 170 Cell cell = cells.next(); 171 if(isContainMergeCell(sheet)){ 172 cancelMergeCell(sheet); 173 } 174 // 區別相同的頭 175 list = ListUtil.changeSameVal(list); 176 map.put(list.get(idx++), getStringCellValue(cell)); 177 } 178 } 179 idx = 0; 180 mapList.add(map); 181 182 } 183 return mapList; 184 } catch (IOException ex) { 185 ex.printStackTrace(); 186 } 187 return null; 188 189 } 190 191 /** 192 * 合並單元格 193 * @param sheet 當前sheet頁 194 * @param firstRow 開始行 195 * @param lastRow 結束行 196 * @param firstCol 開始列 197 * @param lastCol 結束列 198 */ 199 public static int mergeCell(Sheet sheet,int firstRow,int lastRow,int firstCol,int lastCol){ 200 if(sheet == null){ 201 return -1; 202 } 203 return sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); 204 } 205 206 207 /** 208 * 取消合並單元格 209 * @param sheet 210 * @param idx 211 */ 212 public static void cancelMergeCell(Sheet sheet){ 213 int sheetMergeCount = sheet.getNumMergedRegions(); 214 for(int idx = 0; idx < sheetMergeCount;){ 215 CellRangeAddress range = sheet.getMergedRegion(idx); 216 217 String val = getMergeCellValue(sheet,range.getFirstRow(),range.getLastRow()); 218 // 取消合並單元格 219 sheet.removeMergedRegion(idx); 220 221 for(int rownum=range.getFirstRow();rownum<range.getLastRow()+1;){ 222 for(int cellnum=range.getFirstColumn();cellnum<range.getLastColumn()+1;){ 223 224 sheet.getRow(rownum).getCell(cellnum).setCellValue(val); 225 226 cellnum ++; 227 } 228 229 rownum ++; 230 } 231 232 idx++; 233 } 234 } 235 236 /** 237 * 判斷指定單元格是否是合並單元格 238 * @param sheet 當前sheet頁 239 * @param firstRow 開始行 240 * @param lastRow 結束行 241 * @param firstCol 開始列 242 * @param lastCol 結束列 243 * @return 244 */ 245 public static boolean isMergeCell(Sheet sheet, 246 int row ,int column){ 247 248 int sheetMergeCount = sheet.getNumMergedRegions(); 249 for(int i = 0; i < sheetMergeCount;){ 250 CellRangeAddress range = sheet.getMergedRegion(i); 251 252 int firstColumn = range.getFirstColumn(); 253 int lastColumn = range.getLastColumn(); 254 int firstRow = range.getFirstRow(); 255 int lastRow = range.getLastRow(); 256 if(row >= firstRow && row <= lastRow){ 257 if(column >= firstColumn && column <= lastColumn){ 258 return true; 259 } 260 } 261 262 i++; 263 } 264 return false; 265 } 266 267 /** 268 * 判斷sheet頁中是否含有合並單元格 269 * @param sheet 270 * @return 271 */ 272 public static boolean isContainMergeCell(Sheet sheet){ 273 if(sheet == null){ 274 return false; 275 } 276 return sheet.getNumMergedRegions()>0 ? true : false; 277 } 278 279 /** 280 * 獲取指定合並單元的值 281 * @param sheet 282 * @param row 283 * @param column 284 * @return 285 */ 286 public static String getMergeCellValue(Sheet sheet, 287 int row ,int column){ 288 289 int sheetMergeCount = sheet.getNumMergedRegions(); 290 for(int i = 0; i < sheetMergeCount;){ 291 CellRangeAddress range = sheet.getMergedRegion(i); 292 293 int firstColumn = range.getFirstColumn(); 294 int lastColumn = range.getLastColumn(); 295 int firstRow = range.getFirstRow(); 296 int lastRow = range.getLastRow(); 297 if(row >= firstRow && row <= lastRow){ 298 if(column >= firstColumn && column <= lastColumn){ 299 Row fRow = sheet.getRow(firstRow); 300 Cell fCell = fRow.getCell(firstColumn); 301 302 return getStringCellValue(fCell) ; 303 } 304 } 305 306 i++; 307 } 308 309 return null; 310 } 311 312 /** 313 * 獲取單元格的值 314 * @param cell 315 * @return 316 */ 317 public static String getStringCellValue(Cell cell) { 318 String strCell = ""; 319 if(cell==null) return strCell; 320 switch (cell.getCellType()) { 321 case Cell.CELL_TYPE_STRING: 322 strCell = cell.getRichStringCellValue().getString().trim(); 323 break; 324 case Cell.CELL_TYPE_NUMERIC: 325 strCell = String.valueOf(cell.getNumericCellValue()); 326 break; 327 case Cell.CELL_TYPE_BOOLEAN: 328 strCell = String.valueOf(cell.getBooleanCellValue()); 329 break; 330 case Cell.CELL_TYPE_FORMULA: 331 FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator(); 332 evaluator.evaluateFormulaCell(cell); 333 CellValue cellValue = evaluator.evaluate(cell); 334 strCell = String.valueOf(cellValue.getNumberValue()) ; 335 break; 336 default: 337 strCell = ""; 338 } 339 return strCell; 340 } 341 342 }
調用方式如下
ExcelUtilTester.java
1 package pers.kangxu.datautils.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import pers.kangxu.datautils.utils.ExcelUtil; 7 8 public class ExcelUtilTester { 9 10 public static void main(String[] args) { 11 List<String[]> datas = new ArrayList<String[]>(); 12 datas.add(new String[]{"狗熊","母","250"}); 13 datas.add(new String[]{"豬糧","不明","251"}); 14 //ExcelUtil.writeExcel("C:\\Users\\Administrator\\Desktop\\test\\test\\test.xls","sheet1",0, new String[]{"姓名","年齡","性別"}, datas); 15 16 System.out.println(ExcelUtil.readExcel("C:\\Users\\Administrator\\Desktop\\test\\test\\test.xls", 0)); 17 18 } 19 }