Java操作Excle(基于Poi)
有一次有个同事问我会不会有java操作Excle,回答当然是不会了!感觉被嘲讽了,于是开始寻找度娘,找到个小例子,结果越写越有意思,最后就成就了这个工具类。
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.FileWriter; 8 import java.io.IOException; 9 import java.io.InputStream; 10 import java.io.InputStreamReader; 11 import java.io.OutputStream; 12 import java.util.ArrayList; 13 import java.util.Date; 14 import java.util.HashSet; 15 import java.util.Iterator; 16 import java.util.List; 17 import java.util.Map.Entry; 18 import java.util.Set; 19 20 import org.apache.poi.hssf.usermodel.HSSFCell; 21 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 22 import org.apache.poi.hssf.usermodel.HSSFFont; 23 import org.apache.poi.hssf.usermodel.HSSFRow; 24 import org.apache.poi.hssf.usermodel.HSSFSheet; 25 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 26 import org.apache.poi.hssf.util.HSSFColor; 27 import org.apache.poi.ss.usermodel.BorderStyle; 28 import org.apache.poi.ss.usermodel.Cell; 29 import org.apache.poi.ss.usermodel.CellStyle; 30 import org.apache.poi.ss.usermodel.DataFormat; 31 import org.apache.poi.ss.usermodel.FillPatternType; 32 import org.apache.poi.ss.usermodel.HorizontalAlignment; 33 import org.apache.poi.ss.usermodel.IndexedColors; 34 import org.apache.poi.ss.usermodel.Row; 35 import org.apache.poi.ss.usermodel.Sheet; 36 import org.apache.poi.ss.usermodel.VerticalAlignment; 37 import org.apache.poi.ss.usermodel.Workbook; 38 import org.apache.poi.ss.util.CellAddress; 39 import org.apache.poi.xssf.usermodel.*; 40 import org.apache.poi.xssf.usermodel.XSSFFont; 41 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 42 43 /** 44 * 45 * 这是一个对excle操作的类 有可以 读取 创建 修改 46 * 47 * 对标题提供了基本的样式 包括 字体 背景颜色 边框 内容还未提供样式 后续处理吧 48 * 49 * @author heyt 50 * @param 51 * 52 */ 53 54 public class Excle { 55 56 public static File excelFile;// 没有用该变量 后续一定变为用这个 57 58 public static InputStream fileInStream;// 没有用该变量 后续一定变为用这个 59 60 public static OutputStream fileOutStream;// 没有用该变量 后续一定变为用这个 61 62 public static Workbook workBook;// 没有用该变量 后续一定变为用这个 63 64 /** 65 * 读取指定路径的Excel文件,并且按行获取数据记录到list中,最后返回结果为装有多行list对象的list数据。 即:一行数据装进一个list 66 * 67 * 注意:有几个sysout 输出语句是当时测试时候用的 如果将来这个方法处问题了 就解开观察一下 68 * 69 * @param cFilePath 70 * @return 71 */ 72 public List<List<String>> readExcle(String cFilePath) { 73 List<List<String>> sumLists = new ArrayList<List<String>>(); 74 List<String> sumList = null; 75 boolean isE2007 = false; // 判断是否是excel2007格式 76 if (cFilePath.endsWith(".xlsx")) 77 isE2007 = true; 78 try { 79 InputStream input = new FileInputStream(cFilePath); // 建立输入流 80 Workbook wb = null; 81 // 根据文件格式(2003或者2007)来初始化 82 if (isE2007) 83 wb = new XSSFWorkbook(input); 84 else 85 wb = new HSSFWorkbook(input); 86 Sheet sheet = wb.getSheetAt(0); // 获得第一个表单 87 Iterator<Row> rows = sheet.rowIterator(); // 获得第一个表单的迭代器 88 while (rows.hasNext()) { 89 Row row = rows.next(); // 获得行数据 90 Iterator<Cell> cells = row.cellIterator(); // 获得第一行的迭代器 91 // System.out.println("现在是读的第:" + row.getRowNum() + "行"); 92 sumList = new ArrayList<String>(); 93 // 遍历一行数据装到subList中 94 int count = 0; 95 int countRes = 0; 96 while (cells.hasNext()) { 97 Cell cell = cells.next(); 98 // System.out.println("读取的第:" + cell.getColumnIndex() + "列" + ",应该写第:" + 99 // countRes + "列"); 100 count = cell.getColumnIndex(); 101 int res = count - countRes; 102 // System.out.println("应该加:" + res + "列的空格"); 103 if (res == 0) { 104 sumList.add(cell.toString()); 105 ++countRes; 106 } else { 107 for (int i = 0; i < res; i++) { 108 sumList.add(" ");// 空位补空格 109 ++countRes; 110 } 111 sumList.add(cell.toString()); 112 ++countRes; 113 } 114 } 115 sumLists.add(sumList); 116 } 117 } catch (IOException ex) { 118 ex.printStackTrace(); 119 } 120 return sumLists; 121 } 122 /** 123 * 根据一个excle的绝对路径,得到一个excle的所有sheet的名称保存到一个list里返回 124 * 125 * @param cFilePath 126 * @return list<String> 127 */ 128 public List<String> getSheetCountName(String cFilePath) { 129 List<String> sheetNames = new ArrayList<String>(); 130 boolean isE2007 = false; // 判断是否是excel2007格式 131 if (cFilePath.endsWith(".xlsx")) 132 isE2007 = true; 133 try { 134 InputStream input = new FileInputStream(cFilePath); // 建立输入流 135 Workbook wb = null; 136 // 根据文件格式(2003或者2007)来初始化 137 if (isE2007) 138 wb = new XSSFWorkbook(input); 139 else 140 wb = new HSSFWorkbook(input); 141 int results = wb.getNumberOfSheets(); 142 for (int i = 0; i < results; i++) { 143 sheetNames.add(wb.getSheetName(i)); 144 } 145 return sheetNames; 146 } catch (IOException ex) { 147 ex.printStackTrace(); 148 } 149 return null;// 正常情况下永远都不会返回一个null吧 150 } 151 /** 152 * 这个是读一个exlce中的一个sheet,cFilePath是excle的绝对路径, 153 * index是sheet的下标,一般配合本类中的getSheetCountName()方法使用即可 154 */ 155 public List<List<String>> readExcleOneSheet(String cFilePath, int index) { 156 List<List<String>> sumLists = new ArrayList<List<String>>(); 157 List<String> sumList = null; 158 boolean isE2007 = false; // 判断是否是excel2007格式 159 if (cFilePath.endsWith(".xlsx")) 160 isE2007 = true; 161 try { 162 InputStream input = new FileInputStream(cFilePath); // 建立输入流 163 Workbook wb = null; 164 // 根据文件格式(2003或者2007)来初始化 165 if (isE2007) 166 wb = new XSSFWorkbook(input); 167 else 168 wb = new HSSFWorkbook(input); 169 Sheet sheet = wb.getSheetAt(index); // 获得第一个表单 170 Iterator<Row> rows = sheet.rowIterator(); // 获得第一个表单的迭代器 171 while (rows.hasNext()) { 172 Row row = rows.next(); // 获得行数据 173 Iterator<Cell> cells = row.cellIterator(); // 获得第一行的迭代器 174 // System.out.println("现在是读的第:" + row.getRowNum() + "行"); 175 sumList = new ArrayList<String>(); 176 // 遍历一行数据装到subList中 177 int count = 0; 178 int countRes = 0; 179 while (cells.hasNext()) { 180 Cell cell = cells.next(); 181 // System.out.println("读取的第:" + cell.getColumnIndex() + "列" + ",应该写第:" + 182 // countRes + "列"); 183 count = cell.getColumnIndex(); 184 int res = count - countRes; 185 // System.out.println("应该加:" + res + "列的空格"); 186 if (res == 0) { 187 sumList.add(cell.toString()); 188 ++countRes; 189 } else { 190 for (int i = 0; i < res; i++) { 191 sumList.add(" ");// 空位补空格 192 ++countRes; 193 } 194 sumList.add(cell.toString()); 195 ++countRes; 196 } 197 } 198 sumLists.add(sumList); 199 } 200 } catch (IOException ex) { 201 ex.printStackTrace(); 202 } 203 return sumLists; 204 } 205 206 /** 207 * 对excle提供样式 说实话很简陋 哈哈 208 * 209 * @param wb 210 * @param endStr 211 * @return 212 */ 213 public static CellStyle initStyle(Workbook wb, final String endStr) { 214 215 if (endStr.equals("xlsx")) { 216 XSSFCellStyle scs = (XSSFCellStyle) wb.createCellStyle(); 217 scs.setAlignment(HorizontalAlignment.CENTER);// 居中 218 scs.setVerticalAlignment(VerticalAlignment.CENTER); 219 220 scs.setBorderBottom(BorderStyle.THIN); // 下边框 221 scs.setBorderLeft(BorderStyle.THIN);// 左边框 222 scs.setBorderTop(BorderStyle.THIN);// 上边框 223 scs.setBorderRight(BorderStyle.THIN);// 右边框 224 225 scs.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); 226 scs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 227 scs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 228 229 XSSFFont xf = (XSSFFont) wb.createFont(); 230 231 xf.setFontName("微软雅黑"); 232 xf.setFontHeightInPoints((short) 10); 233 234 scs.setFont(xf); 235 return scs; 236 } 237 if (endStr.equals("xls")) { 238 239 HSSFCellStyle hcs = (HSSFCellStyle) wb.createCellStyle(); 240 hcs.setAlignment(HorizontalAlignment.CENTER);// 居中 241 hcs.setVerticalAlignment(VerticalAlignment.CENTER); 242 hcs.setBorderBottom(BorderStyle.THIN); // 下边框 243 hcs.setBorderLeft(BorderStyle.THIN);// 左边框 244 hcs.setBorderTop(BorderStyle.THIN);// 上边框 245 hcs.setBorderRight(BorderStyle.THIN);// 右边框 246 hcs.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); 247 hcs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 248 hcs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 249 HSSFFont hf = (HSSFFont) wb.createFont(); 250 hf.setFontName("微软雅黑"); 251 hf.setFontHeightInPoints((short) 10); 252 253 hcs.setFont(hf); 254 return hcs; 255 } 256 return null; 257 } 258 259 /** 260 * 对excle提供样式 说实话很简陋 哈哈 261 * 262 * @param wb 263 * @param endStr 264 * @return 265 */ 266 public static CellStyle initStyle2(Workbook wb, final String endStr) { 267 268 if (endStr.equals("xlsx")) { 269 XSSFCellStyle scs = (XSSFCellStyle) wb.createCellStyle(); 270 scs.setAlignment(HorizontalAlignment.LEFT);// 居中 271 scs.setVerticalAlignment(VerticalAlignment.CENTER); 272 scs.setBorderBottom(BorderStyle.THIN); // 下边框 273 scs.setBorderLeft(BorderStyle.THIN);// 左边框 274 scs.setBorderTop(BorderStyle.THIN);// 上边框 275 scs.setBorderRight(BorderStyle.THIN);// 右边框 276 277 // scs.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); 278 // scs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 279 // scs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 280 281 XSSFFont xf = (XSSFFont) wb.createFont(); 282 xf.setFontName("黑体"); 283 xf.setFontHeightInPoints((short) 10); 284 scs.setFont(xf); 285 return scs; 286 } 287 if (endStr.equals("xls")) { 288 289 HSSFCellStyle hcs = (HSSFCellStyle) wb.createCellStyle(); 290 hcs.setAlignment(HorizontalAlignment.LEFT);// 居中 291 hcs.setVerticalAlignment(VerticalAlignment.CENTER); 292 hcs.setBorderBottom(BorderStyle.THIN); // 下边框 293 hcs.setBorderLeft(BorderStyle.THIN);// 左边框 294 hcs.setBorderTop(BorderStyle.THIN);// 上边框 295 hcs.setBorderRight(BorderStyle.THIN);// 右边框 296 // hcs.setFillForegroundColor(IndexedColors.BLUE.getIndex()); 297 // hcs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 298 // hcs.setFillPattern(FillPatternType.SOLID_FOREGROUND); 299 HSSFFont hf = (HSSFFont) wb.createFont(); 300 hf.setFontName("黑体"); 301 hf.setFontHeightInPoints((short) 10); 302 hcs.setFont(hf); 303 return hcs; 304 } 305 306 return null; 307 } 308 309 /** 310 * @param filePath 311 * 文件路径 312 * @param str 313 * 表头的列名 314 * @param sheetName 315 * 顾名思义 316 * @return 317 */ 318 public static boolean writeExcle(String filePath, String[] str, String sheetName) { 319 320 String tFilePath = initFile(filePath); 321 322 boolean bo = true; 323 Workbook wb = null; 324 CellStyle cs = null; 325 // 定义一个新的工作簿 326 if (tFilePath.endsWith(".xlsx")) { 327 wb = new XSSFWorkbook(); 328 cs = initStyle(wb, "xlsx"); 329 } else if (tFilePath.endsWith(".xls")) { 330 wb = new HSSFWorkbook(); 331 cs = initStyle(wb, "xls"); 332 } else 333 bo = false; 334 // 创建sheet1 335 Sheet sheet = wb.createSheet(sheetName); 336 337 // 创建行 338 Row row = sheet.createRow(0); 339 340 // DataFormat df= wb.createDataFormat(); 341 342 // scs.setDataFormat(df.getFormat("@")); 343 344 for (int i = 0; i < str.length; i++) { 345 346 // sheet.autoSizeColumn(i);//宽度自适应 亲测不管用 347 348 row.createCell(i).setCellStyle(cs); 349 row.getCell(i).setCellValue(str[i]);// 创建单元格 表头 350 351 } 352 // 写入 353 try { 354 FileOutputStream fileOutputStream = new FileOutputStream(tFilePath); 355 wb.write(fileOutputStream); 356 fileOutputStream.close(); 357 } catch (IOException e) { 358 e.printStackTrace(); 359 } 360 361 return bo; 362 } 363 364 /** 365 * @param filePath 366 * 文件路径 367 * @param str 368 * 表头的列名 369 * @param sheetName 370 * 顾名思义 371 * @param lis 372 * 填入exlce的数据 373 * @return 374 */ 375 protected static boolean writeExcle(String filePath, String[] str, String sheetName, List<List<String>> lis) { 376 377 boolean bo = true; 378 Workbook wb = null; 379 String tFilePath = initFile(filePath); 380 CellStyle cs = null; 381 CellStyle cs2 = null; 382 // 定义一个新的工作簿 383 if (tFilePath.endsWith(".xlsx")) { 384 wb = new XSSFWorkbook(); 385 cs = initStyle(wb, "xlsx"); 386 cs2 = initStyle2(wb, "xlsx"); 387 } else if (tFilePath.endsWith(".xls")) { 388 wb = new HSSFWorkbook(); 389 cs = initStyle(wb, "xls"); 390 cs2 = initStyle2(wb, "xls"); 391 } else 392 bo = false; 393 394 // 创建sheet1 395 Sheet sheet = wb.createSheet(sheetName); 396 // sheet.autoSizeColumn(0);//宽度自适应 397 398 // 创建行 399 Row row = sheet.createRow(0); 400 401 for (int k = 0; k < str.length; k++) { 402 403 row.createCell(k).setCellValue(str[k]);// 创建单元格 表头 404 row.getCell(k).setCellStyle(cs); 405 } 406 407 for (int i = 0; i < lis.size(); i++) { 408 409 Row row2 = sheet.createRow(i + 1); 410 411 for (int j = 0; j < lis.get(i).size(); j++) { 412 413 row2.createCell(j).setCellValue(lis.get(i).get(j).toString()); 414 415 row2.getCell(j).setCellStyle(cs2); 416 417 // 这是不是应该也加一个样式呢 这就是个问题了 怎么完善呢 后续处理吧 initStyle2() return cellStyle; 418 419 } 420 } 421 422 // 写入 423 try { 424 FileOutputStream fileOutputStream = new FileOutputStream(tFilePath); 425 wb.write(fileOutputStream); 426 wb.close(); 427 fileOutputStream.close(); 428 } catch (IOException e) { 429 // TODO Auto-generated catch block 430 e.printStackTrace(); 431 } 432 433 return bo; 434 } 435 436 public static boolean writeExcle(String filePath) { 437 438 boolean bo = true; 439 Workbook wb = null; 440 String tFilePath = initFile(filePath); 441 // 定义一个新的工作簿 442 if (tFilePath.endsWith(".xlsx")) { 443 wb = new XSSFWorkbook(); 444 } else if (tFilePath.endsWith(".xls")) 445 wb = new HSSFWorkbook(); 446 else 447 bo = false; 448 // 创建sheet1 449 Sheet sheet = wb.createSheet("sheet1"); 450 451 // 创建行 452 Row row = sheet.createRow(0); 453 454 // 写入 455 try { 456 FileOutputStream fileOutputStream = new FileOutputStream(tFilePath); 457 wb.write(fileOutputStream); 458 wb.close(); 459 } catch (IOException e) { 460 // TODO Auto-generated catch block 461 e.printStackTrace(); 462 } 463 464 return bo; 465 } 466 467 // 配合initFile 方法的变量 468 public static int tOneCountForInitFile = 1; 469 470 /** 471 * 判断当前系统中是否存在该文件,如果存在则换一个名字, 也就是不会造成文件的内容覆盖。 472 * 473 * @param filePath 474 * @return 文件名 475 */ 476 public static String initFile(String filePath) { 477 478 String tFilePath = filePath.replace("//", "\\"); 479 480 tFilePath = tFilePath.replace("/", "\\"); 481 482 String ss = ""; 483 // 才疏学浅,真心不知道怎么处理,只能用这样的苯方法获取文件名了 484 ss = tFilePath.substring(0, tFilePath.lastIndexOf("\\") + 1); 485 486 boolean bo = false; 487 488 File[] files = new File(ss).listFiles(); 489 490 for (File file : files) { 491 492 String str2 = file.getPath(); 493 494 if (!str2.contains("."))// 文件夹就不需要校验了 495 continue; 496 497 if (str2.equals(filePath)) { 498 bo = true; 499 break; 500 } 501 } 502 503 if (bo) { 504 505 if (tFilePath.contains("(")) { 506 507 tOneCountForInitFile++; 508 tFilePath = filePath.substring(0, filePath.lastIndexOf("(")) + "(" + tOneCountForInitFile + ")" 509 + filePath.substring(filePath.lastIndexOf("."), filePath.length()); 510 511 } else { 512 tFilePath = filePath.substring(0, filePath.lastIndexOf(".")) + "(" + tOneCountForInitFile + ")" 513 + filePath.substring(filePath.lastIndexOf("."), filePath.length()); 514 515 } 516 return initFile(tFilePath); 517 } 518 return tFilePath; 519 } 520 521 /** 522 * @param sourceString 523 * 源字符串 524 * @param targetString 525 * 目标字符串 526 * @param count 527 * 第几次出现 528 * @param flag 529 * 查找方向(正向查找,反向查找) 530 * @return 出现的位置(都是正向开始计算) 531 * 532 */ 533 534 public static int indexWithCount(String sourceString, String targetString, int count, int flag) { 535 536 int lengthCount = 0; 537 if (!sourceString.contains(targetString)) // 判断是否存在目标字符串 538 return -1; 539 int strHaveHowCount = strHaveHowCount(sourceString, targetString); // 目标字符串出现了几次 540 if (strHaveHowCount < count) 541 return -1; 542 if (flag == -1) { 543 count = strHaveHowCount - count + 1; 544 } else if (flag == 1 || flag == 0) { 545 count = count; 546 } else 547 return -1; 548 int j = 0; 549 for (int i = 0; i < count; i++) { 550 if (count == 1) { 551 lengthCount = sourceString.indexOf(targetString); 552 return lengthCount; 553 } else { 554 lengthCount = sourceString.indexOf(targetString, j); 555 j = lengthCount + 1; 556 } 557 } 558 return lengthCount; 559 } 560 561 /** 562 * @param sourceString 563 * 源字符串 564 * @param targetString 565 * 目标字符串 566 * @param count 567 * 第几次出现 568 * @return 出现的位置(都是正向开始计算) indexWithCount的方法的重构 没写最后一个参数是 默认从请往后查询 569 */ 570 protected static int indexWithCount(String sourceString, String targetString, int count) { 571 572 int lengthCount = 0; 573 if (!sourceString.contains(targetString)) // 判断是否存在目标字符串 574 return -1; 575 int strHaveHowCount = strHaveHowCount(sourceString, targetString); // 目标字符串出现了几次 576 if (strHaveHowCount < count) 577 return -1; 578 int j = 0; 579 for (int i = 0; i < count; i++) { 580 if (count == 1) { 581 lengthCount = sourceString.indexOf(targetString); 582 return lengthCount; 583 } else { 584 lengthCount = sourceString.indexOf(targetString, j); 585 j = lengthCount + 1; 586 } 587 } 588 return lengthCount; 589 } 590 591 /** 592 * 次方法就是判断出一个字符串在另一个中出出现的多少次 593 * 594 * @param a 595 * 被匹配的长字符串 596 * @param b 597 * 匹配的短字符串 598 * @return 匹配次数 599 */ 600 public static int strHaveHowCount(String sourceStr, String targetStr) { 601 602 if (sourceStr.length() < targetStr.length()) { 603 return 0; 604 } 605 char[] a_t = sourceStr.toCharArray(); 606 int count = 0; 607 for (int i = 0; i <= sourceStr.length() - targetStr.length(); i++) {// 条件必须用 <= 要不然会少比较一次 608 StringBuffer buffer = new StringBuffer(); 609 for (int j = 0; j < targetStr.length(); j++) { 610 buffer.append(a_t[i + j]); 611 } 612 if (buffer.toString().equals(targetStr)) { 613 count++; 614 } 615 } 616 return count; 617 } 618 619 /** 620 * 621 * @param sourceStr 622 * 源字符串 623 * @param targetStr 624 * 目标字符串 625 * @return count 次数(注意“aaa”找“aa”这样算出现一次) 626 */ 627 public static int strHaveHowCount2(String sourceStr, String targetStr) { 628 629 int count = 0; 630 631 if (sourceStr.length() < targetStr.length()) { 632 return count; 633 } 634 635 int bigLength = sourceStr.length(); 636 int smallLength = targetStr.length(); 637 638 String newSourceStr = ""; 639 640 if (sourceStr.contains(targetStr)) { 641 newSourceStr = sourceStr.replace(targetStr, ""); 642 } else { 643 return 0; 644 645 } 646 int newBigLength = newSourceStr.length(); 647 648 count = (bigLength - newBigLength) / smallLength; 649 650 return count; 651 } 652 653 /** 654 * 这个方法是读一个文本格式的文件,按行读取将内容放到一个List里面 655 * 656 * @param filePath 657 * @return 658 */ 659 public static List<String> readOneFile(String filePath) { 660 List<String> resultList = new ArrayList<String>();// 获取文件中每一行的字符串 661 int count = 0; 662 try { 663 // String encoding = "UTF-8"; 664 File file = new File(filePath); 665 if (file.isFile() && file.exists()) { // 判断文件是否存在 666 InputStreamReader read = new InputStreamReader(new FileInputStream(file));// 考虑到编码格式 667 BufferedReader bufferedReader = new BufferedReader(read); 668 String lineTxt = null; 669 while ((lineTxt = bufferedReader.readLine()) != null) { 670 resultList.add(lineTxt); 671 // System.out.println(lineTxt); 672 count++; 673 } 674 count = 0; 675 read.close(); 676 } else { 677 System.err.println("找不到指定的文件"); 678 } 679 } catch (Exception e) { 680 System.err.println("读取文件内容出错"); 681 e.printStackTrace(); 682 } 683 return resultList; 684 } 685 686 /** 687 * 这个是借用了读取单个excle的方法 可以完成对一个文件夹下的所有excle内容的读取(只能读到每个excle的第一个sheet,后续完善) 688 * 689 * @param filePaths 690 * @return 691 */ 692 public List<List<String>> readExcleAll(String filePaths) { 693 694 File[] files = new File(filePaths).listFiles(); 695 696 List<List<String>> lis = new ArrayList<List<String>>(); 697 698 for (int i = 0; i < files.length; i++) { 699 700 List<List<String>> li = new ArrayList<List<String>>(); 701 702 li = readExcle(files[i].getPath()); 703 704 for (int j = 0; j < li.size(); j++) { 705 706 lis.add(li.get(j)); 707 } 708 } 709 710 System.out.println("获取多个excle后,一共得到:" + lis.size() + "====行的数据"); 711 return lis; 712 } 713 714 /** 715 * 这是为getFileList() 提供的辅助属性,用于存放所符合条件的路径 716 */ 717 public List<String> oneLis = new ArrayList<String>(); 718 719 /** 720 * 获取一个文件夹下的所有文件名的绝对路径,这个方法是getFileList(String filepath)的方法的重写 可以获得 规定后缀的文件 721 * 722 * @param filepath 723 * @return 724 */ 725 public List<String> getFileList(String filepath, String engStr) { 726 727 File file = new File(filepath); 728 File[] files = file.listFiles(); // 该文件目录下文件全部放入数组 729 if (files != null) { 730 for (int i = 0; i < files.length; i++) { 731 String fileName = files[i].getName(); 732 if (files[i].isDirectory()) { // 判断是文件还是文件夹 733 getFileList(files[i].getAbsolutePath(), engStr); // 获取文件绝对路径 734 } else { 735 if (files[i].getAbsolutePath().endsWith(engStr)) 736 oneLis.add(files[i].getAbsolutePath()); // 将符合规定后缀的文件收集到 一个集合里 737 } 738 } 739 } 740 // 用于输出一个文件夹地址下存在多少个文件 利用了递归方法 每一条 741 // System.out.println("一同获得" + oneLis.size() + "条路径!!!!!"); 742 return oneLis; 743 } 744 745 /** 746 * 获取一个文件夹下的所有文件名的绝对路径 747 * 748 * @param filepath 749 * @return 750 */ 751 public List<String> getFileList(String filepath) { 752 753 File file = new File(filepath); 754 File[] files = file.listFiles(); // 该文件目录下文件全部放入数组 755 if (files != null) { 756 for (int i = 0; i < files.length; i++) { 757 String fileName = files[i].getName(); 758 if (files[i].isDirectory()) { // 判断是文件还是文件夹 759 getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径 760 } else { 761 oneLis.add(files[i].getAbsolutePath()); 762 } 763 } 764 } 765 System.out.println("一同获得" + oneLis.size() + "条路径!!!!!"); 766 return oneLis; 767 } 768 769 /** 770 * 771 * 读取exce的全部sheet的数据,把每一个sheet的名称放到每一行数据的最后一列 772 * 773 * @param cFilePath 774 * @return 775 */ 776 public static List<List<String>> readExcleAllSheet(String cFilePath) { 777 List<List<String>> sumLists = new ArrayList<List<String>>(); 778 ArrayList<String> sumList = null; 779 boolean isE2007 = false; // 判断是否是excel2007格式 780 if (cFilePath.endsWith(".xlsx")) 781 isE2007 = true; 782 try { 783 InputStream input = new FileInputStream(cFilePath); // 建立输入流 784 Workbook wb = null; 785 // 根据文件格式(2003或者2007)来初始化 786 if (isE2007) 787 wb = new XSSFWorkbook(input); 788 else 789 wb = new HSSFWorkbook(input); 790 Sheet sheet = null;// 获得第一个表单 791 792 for (int j = 0; j < wb.getNumberOfSheets(); j++) { 793 sheet = wb.getSheetAt(j); 794 795 if (sheet == null) 796 continue; 797 798 Iterator<Row> rows = sheet.rowIterator(); // 获得第一个表单的迭代器 799 while (rows.hasNext()) { 800 Row row = rows.next(); // 获得行数据 801 Iterator<Cell> cells = row.cellIterator(); // 获得第一行的迭代器 802 sumList = new ArrayList<String>(); 803 804 // 遍历一行数据装到subList中 805 int count = 0; 806 int countRes = 0; 807 while (cells.hasNext()) { 808 Cell cell = cells.next(); 809 // System.out.println(cell.getColumnIndex()); 810 count = cell.getColumnIndex(); 811 812 int res = count - countRes; 813 // System.out.println("应该加:"+res); 814 if (res == 0) { 815 sumList.add(new String(cell.toString())); 816 countRes++; 817 } else { 818 for (int i = 0; i < res; i++) { 819 sumList.add(" ");// 空位补空格 820 countRes++; 821 } 822 sumList.add(new String(cell.toString())); 823 } 824 } 825 count = 0; 826 countRes = 0; 827 sumList.add(sheet.getSheetName()); 828 sumLists.add(sumList); 829 830 } 831 } 832 } catch (IOException ex) { 833 ex.printStackTrace(); 834 } 835 return sumLists; 836 } 837 838 839 /** 840 * 这个参数是一个set集合 为了处理那种重复数据 841 * 842 * @param set 843 * 需要的内容 844 * @param tPath 845 * 文件绝对地址 846 * @return 虽然是boolean类型 但是没有做任何操作 后续需要在说吧 847 */ 848 public static boolean writeFileAtPath(Set set, String tPath) { 849 850 Excle ex = new Excle(); 851 Iterator iterator = set.iterator(); 852 String endPath = ex.initFile(tPath);// 将生成的sql放到指点的文件地址 853 File file = new File(endPath); 854 FileWriter fw = null; 855 BufferedWriter writer = null; 856 try { 857 fw = new FileWriter(file); 858 writer = new BufferedWriter(fw); 859 while (iterator.hasNext()) { 860 writer.write(iterator.next().toString()); 861 writer.newLine();// 换行 862 } 863 writer.flush(); 864 } catch (FileNotFoundException e) { 865 e.printStackTrace(); 866 } catch (IOException e) { 867 e.printStackTrace(); 868 } finally { 869 try { 870 writer.close(); 871 fw.close(); 872 } catch (IOException e) { 873 e.printStackTrace(); 874 } 875 } 876 return true; 877 } 878 879 /** 880 * 这个参数是一个list集合 可以做到有序 881 * 882 * @param list 883 * 需要的内容 884 * @param tPath 885 * 文件的绝对地址 886 * @return 虽然是boolean类型 但是没有做任何操作 后续需要在说吧 887 */ 888 public static boolean writeFileAtPath(List list, String tPath) { 889 890 Excle ex = new Excle(); 891 Iterator iterator = list.iterator(); 892 String endPath = ex.initFile(tPath);// 将生成的sql放到指点的文件地址 893 File file = new File(endPath); 894 FileWriter fw = null; 895 BufferedWriter writer = null; 896 try { 897 fw = new FileWriter(file); 898 writer = new BufferedWriter(fw); 899 while (iterator.hasNext()) { 900 writer.write(iterator.next().toString()); 901 writer.newLine();// 换行 902 } 903 writer.flush(); 904 } catch (FileNotFoundException e) { 905 e.printStackTrace(); 906 } catch (IOException e) { 907 e.printStackTrace(); 908 } finally { 909 try { 910 writer.close(); 911 fw.close(); 912 } catch (IOException e) { 913 e.printStackTrace(); 914 } 915 } 916 return false; 917 } 918 919 public static void main(String[] args) throws IOException { 920 921 //initFile("E:\\nety"); 922 923 } 924 925 }