Przeglądaj źródła

处理excel导入日期报错问题

longht 3 lat temu
rodzic
commit
09eb0aced3
1 zmienionych plików z 67 dodań i 7 usunięć
  1. 67 7
      src/public/nc/pub/toos/FileTool/ExcelUtil.java

+ 67 - 7
src/public/nc/pub/toos/FileTool/ExcelUtil.java

@@ -12,9 +12,11 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import org.apache.poi.hssf.usermodel.HSSFCell;
@@ -22,6 +24,7 @@ import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
@@ -84,7 +87,7 @@ public class ExcelUtil {
             HSSFSheet sheet = wb.getSheetAt(0);  
             HSSFRow row;  
             HSSFCell cell;  
-            Object value;  
+            Object value = null;  
             for(int i = sheet.getFirstRowNum() , rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows() ; i++ ){  
                 row = sheet.getRow(i);  
                 colList = new ArrayList<Object>();  
@@ -111,7 +114,36 @@ public class ExcelUtil {
                             value = cell.getStringCellValue();    
                             break;    
                         case NUMERIC:    
-                            value = cell.getNumericCellValue();    
+                        	short format = cell.getCellStyle().getDataFormat();
+                            if (DateUtil.isCellDateFormatted(cell)) {
+                                SimpleDateFormat sdf = null;  
+                                //System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat());
+                                if (format == 20 || format == 32) {  
+                                    sdf = new SimpleDateFormat("HH:mm");  
+                                } else if (format == 14 || format == 31 || format == 57 || format == 58) {  
+                                    // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)  
+                                    sdf = new SimpleDateFormat("yyyy-MM-dd");  
+                                    double celvalue = cell.getNumericCellValue();  
+                                    Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(celvalue);  
+                                    value = sdf.format(date);  
+                                }else {// 日期  
+                                    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
+                                }  
+                                try {
+                                    value = sdf.format(cell.getDateCellValue());// 日期
+                                } catch (Exception e) {
+                                    try {
+                                        throw new Exception("exception on get date data !".concat(e.toString()));
+                                    } catch (Exception e1) {
+                                        e1.printStackTrace();
+                                    }
+                                }finally{
+                                    sdf = null;
+                                }
+                            }  else {
+                               // BigDecimal bd = new BigDecimal(cell.getNumericCellValue()); 
+                                value = cell.toString();// 数值 这种用BigDecimal包装再获取plainString,可以防止获取到科学计数值
+                            }      
                             break;    
                         case BOOLEAN:    
                             value = Boolean.valueOf(cell.getBooleanCellValue());  
@@ -141,7 +173,7 @@ public class ExcelUtil {
             XSSFSheet sheet = wb.getSheetAt(0);  
             XSSFRow row;  
             XSSFCell cell;  
-            Object value;  
+            Object value = null;  
             for(int i = sheet.getFirstRowNum() , rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows() ; i++ ){  
                 row = sheet.getRow(i);  
                 colList = new ArrayList<Object>();  
@@ -168,7 +200,36 @@ public class ExcelUtil {
                             value = cell.getStringCellValue();    
                             break;    
                         case NUMERIC:    
-                        	value = cell.getNumericCellValue();      
+                        	short format = cell.getCellStyle().getDataFormat();
+                            if (DateUtil.isCellDateFormatted(cell)) {
+                                SimpleDateFormat sdf = null;  
+                                //System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat());
+                                if (format == 20 || format == 32) {  
+                                    sdf = new SimpleDateFormat("HH:mm");  
+                                } else if (format == 14 || format == 31 || format == 57 || format == 58) {  
+                                    // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)  
+                                    sdf = new SimpleDateFormat("yyyy-MM-dd");  
+                                    double celvalue = cell.getNumericCellValue();  
+                                    Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(celvalue);  
+                                    value = sdf.format(date);  
+                                }else {// 日期  
+                                    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
+                                }  
+                                try {
+                                    value = sdf.format(cell.getDateCellValue());// 日期
+                                } catch (Exception e) {
+                                    try {
+                                        throw new Exception("exception on get date data !".concat(e.toString()));
+                                    } catch (Exception e1) {
+                                        e1.printStackTrace();
+                                    }
+                                }finally{
+                                    sdf = null;
+                                }
+                            }  else {
+                               // BigDecimal bd = new BigDecimal(cell.getNumericCellValue()); 
+                                value = cell.toString();// 数值 这种用BigDecimal包装再获取plainString,可以防止获取到科学计数值
+                            }      
                             break;    
                         case BOOLEAN:    
                             value = Boolean.valueOf(cell.getBooleanCellValue());  
@@ -180,7 +241,7 @@ public class ExcelUtil {
                             value = cell.toString();    
                     }// end switch  
                    
-                    colList.add(cell.toString());  
+                    colList.add(value);  
                 }//end for j  
                 rowList.add(colList);  
             }//end for i  
@@ -324,8 +385,7 @@ public class ExcelUtil {
             return rowList;
         }
     
-    
-      
+          
     public static DecimalFormat getDf() {  
         return df;  
     }