POI读取 Excel

系统管理员 2022-02-18 11:47 421阅读 0赞

可解决 整形变浮点型、日期读取变成整型或其他未知类型、 数字变成科学计数法等问题。

依赖:

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>3.9</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml</artifactId>
  9. <version>3.9</version>
  10. </dependency>

工具类:

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.InputStream;
  4. import java.text.DateFormat;
  5. import java.text.DecimalFormat;
  6. import java.text.SimpleDateFormat;
  7. import java.util.ArrayList;
  8. import java.util.Date;
  9. import java.util.List;
  10. import org.apache.commons.io.FilenameUtils;
  11. import org.apache.commons.io.IOUtils;
  12. import org.apache.commons.lang3.time.DateFormatUtils;
  13. import org.apache.poi.hssf.usermodel.*;
  14. import org.apache.poi.ss.usermodel.Cell;
  15. import org.apache.poi.ss.usermodel.CellStyle;
  16. import org.apache.poi.ss.util.NumberToTextConverter;
  17. import org.apache.poi.xssf.usermodel.XSSFCell;
  18. import org.apache.poi.xssf.usermodel.XSSFRow;
  19. import org.apache.poi.xssf.usermodel.XSSFSheet;
  20. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  21. public class ExcelReadUtil {
  22. public static void main(String[] args) {
  23. String path = "C:\\Users\\Administrator\\Documents\\tmp_template\\模板.xlsx";
  24. try {
  25. List<List<String>> result = new ExcelReadUtil().read(path);
  26. System.out.println("总行数:"+result.size());
  27. for (int i = 0; i < result.size(); i++) {
  28. List<String> model = result.get(i);
  29. System.out.println(model.toString());
  30. }
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. public static List<List<String>> read(String path) throws Exception{
  36. File file=new File(path);
  37. String ext=FilenameUtils.getExtension(file.getName());
  38. if("xls".equalsIgnoreCase(ext)){
  39. return readXls(path);
  40. }else if("xlsx".equalsIgnoreCase(ext)){
  41. return readXlsx(path);
  42. }
  43. return null;
  44. }
  45. public static List<List<String>> read(String pathDir,String fileName) throws Exception{
  46. File file=new File(pathDir,fileName);
  47. return read(file.getAbsolutePath());
  48. }
  49. /** * * @Title: readXls * @Description: 处理xls文件 * @param @param path * @param @return * @param @throws Exception 设定文件 * @return List<List<String>> 返回类型 * @throws * */
  50. private static List<List<String>> readXls(String path) throws Exception {
  51. InputStream is = new FileInputStream(path);
  52. // HSSFWorkbook 标识整个excel
  53. HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
  54. List<List<String>> result = new ArrayList<List<String>>();
  55. int size = hssfWorkbook.getNumberOfSheets();
  56. // 循环每一页,并处理当前循环页
  57. // for (int numSheet = 0; numSheet < size; numSheet++) { //遍历所有的sheet页
  58. for (int numSheet = 0; numSheet < 1; numSheet++) { //numSheet<1,即 只读取第一个sheet页。
  59. // HSSFSheet 标识某一页
  60. HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
  61. if (hssfSheet == null) {
  62. continue;
  63. }
  64. // 处理当前页,循环读取每一行
  65. for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) { //第1行是标题,要跳过,从第2行开始读,即下标是1。
  66. // HSSFRow表示行
  67. HSSFRow hssfRow = hssfSheet.getRow(rowNum);
  68. if(hssfRow==null){
  69. break;
  70. }
  71. int minColIx = hssfRow.getFirstCellNum();
  72. int maxColIx = hssfRow.getLastCellNum();
  73. List<String> rowList = new ArrayList<String>();
  74. // 遍历改行,获取处理每个cell元素
  75. for (int colIx = minColIx; colIx < maxColIx; colIx++) {
  76. // HSSFCell 表示单元格
  77. HSSFCell cell = hssfRow.getCell(colIx);
  78. if (cell == null) {
  79. rowList.add("");
  80. }else{
  81. rowList.add(getStringVal(cell));
  82. }
  83. }
  84. result.add(rowList);
  85. }
  86. }
  87. return result;
  88. }
  89. private static List<List<String>> readXlsx(String path) throws Exception {
  90. InputStream is = new FileInputStream(path);
  91. XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
  92. List<List<String>> result = new ArrayList<List<String>>();
  93. // 循环每一页,并处理当前循环页
  94. if(xssfWorkbook.iterator().hasNext()){ //只读取第一个sheet页
  95. // for (XSSFSheet xssfSheet : xssfWorkbook) { //遍历所有的sheet页
  96. XSSFSheet xssfSheet=xssfWorkbook.iterator().next(); //只读取第一个sheet 页
  97. // if (xssfSheet == null) {
  98. // continue;
  99. // }
  100. // 处理当前页,循环读取每一行
  101. for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) { //第1行是标题,要跳过,从第2行开始读,即下标是1。
  102. XSSFRow xssfRow = xssfSheet.getRow(rowNum);
  103. if(xssfRow==null){
  104. break;
  105. }
  106. int minColIx = xssfRow.getFirstCellNum();
  107. int maxColIx = xssfRow.getLastCellNum();
  108. List<String> rowList = new ArrayList<String>();
  109. for (int colIx = minColIx; colIx < maxColIx; colIx++) {
  110. XSSFCell cell = xssfRow.getCell(colIx);
  111. if (cell == null) {
  112. rowList.add("");
  113. }else{
  114. //rowList.add(cell.toString());
  115. rowList.add(getStringVal(cell));
  116. }
  117. }
  118. result.add(rowList);
  119. }
  120. }
  121. return result;
  122. }
  123. /** * 改造poi默认的toString()方法如下 */
  124. private static String getStringVal(Cell cell) {
  125. switch (cell.getCellType()) {
  126. case Cell.CELL_TYPE_BOOLEAN:
  127. return cell.getBooleanCellValue() ? "true" : "false";
  128. case Cell.CELL_TYPE_FORMULA:
  129. return cell.getCellFormula();
  130. case Cell.CELL_TYPE_NUMERIC:
  131. String cellvalue = "";
  132. short format = cell.getCellStyle().getDataFormat();
  133. if(format == 14 || format == 31 || format == 57 || format == 58){ //excel中的时间格式
  134. Date date = cell.getDateCellValue();
  135. cellvalue = DateFormatUtils.format(date, "yyyy-MM-dd");
  136. }
  137. // 判断当前的cell是否为 Date
  138. else if (HSSFDateUtil.isCellDateFormatted(cell)) {
  139. Date date = cell.getDateCellValue();
  140. DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
  141. cellvalue= formater.format(date);
  142. } else { // 如果是纯数字
  143. // 取得当前Cell的数值
  144. cellvalue = NumberToTextConverter.toText(cell.getNumericCellValue());
  145. }
  146. return cellvalue;
  147. case Cell.CELL_TYPE_STRING:
  148. return cell.getStringCellValue();
  149. default:
  150. return "";
  151. }
  152. }
  153. }

发表评论

表情:
评论列表 (有 0 条评论,421人围观)

还没有评论,来说两句吧...

相关阅读