Java 如何使用ApachePOI4.X读取Excel(xlsx)标题列数据类型

Java 如何使用ApachePOI4.X读取Excel(xlsx)标题列数据类型,java,apache-poi,Java,Apache Poi,我一直在努力寻找读取每个标题列的数据类型的方法。 我使用ApachePOI4.1.2读取XLSX文件格式,使用 XSSF工作簿实现 业务用例:我有一个包含22个单元格的excel(包括字符串、数字、日期字段) 如果用户试图将日期字段修改为字符串或将数字字段修改为字符串,反之亦然。我需要在不读取数据行的情况下抛出errow。图格 h我能够处理数据行,以防用户修改类型(日期值为varchar,数字为String) Sudo代码段: XSSFRow headerRow = sheet.getRow(r

我一直在努力寻找读取每个标题列的数据类型的方法。 我使用ApachePOI4.1.2读取XLSX文件格式,使用 XSSF工作簿实现

业务用例:我有一个包含22个单元格的excel(包括字符串、数字、日期字段) 如果用户试图将日期字段修改为字符串或将数字字段修改为字符串,反之亦然。我需要在不读取数据行的情况下抛出errow。图格 h我能够处理数据行,以防用户修改类型(日期值为varchar,数字为String)

Sudo代码段:

XSSFRow headerRow = sheet.getRow(rownum:0);
for(int cellNum=0; cellNum<22;cellNum++){
  Cell cell = headerRow.getCell(cellNum);
  System.out.println(cell.getCellType()); 
// This always returns the string even though the header row has date and numeric fields)
}
XSSFRow headerRow=sheet.getRow(rownum:0);

对于(int-cellNum=0;cellNum,无法根据标题识别列类型。标题通常是我们在文件第一行中输入的文本(字符串)。它们不包含任何特定的数据类型

另一方面,如果您必须理解列类型,那么您必须从文件的第二行读取(保留标题)

这里有一些在分析列类型方面做得很好的实现。您可以提到要分析的行数和分析

的表。 代码:

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
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.xssf.usermodel.XSSFWorkbook;

public class Test {

    public static void main(String[] args) {
        
        String excelFileName = "C:\\Users\\test\\Downloads\\test.xlsx";
        int sheet_num = 0;
        int maxRows_ToAnalyze = 5;
        
        Map<Integer, String> result = analyzeColumnTypes(excelFileName, sheet_num, maxRows_ToAnalyze);
        
        for(int i : result.keySet()) {
            System.out.println("Column "+i+" is of type ==> "+result.get(i));
        }
        
    }
    
    static String NUMERIC = "NUMERIC";
    static String DATE = "DATE";
    static String STRING = "STRING";
    static String FORMULA = "FORMULA";
    static String BLANK = "BLANK";
    static String BOOLEAN = "BOOLEAN";
    static String ERROR = "ERROR";
    static String NOT_CONSISTENT = "NOT_CONSISTENT";

    public static Map<Integer, String> analyzeColumnTypes(String excelFileName, int sheet_num, int maxRows_ToAnalyze){
        
        Workbook workbook = null;
        Map<Integer, String> columnTypeMap = new HashMap<Integer, String>();
        Map<Integer, Set<String>> tempMap = new HashMap<>();

        Pattern p = Pattern.compile("[^0-9\\.]", Pattern.CASE_INSENSITIVE);

        try {
            FileInputStream excelFile = new FileInputStream(new File(excelFileName));
            workbook = new XSSFWorkbook(excelFile);
            Sheet sheet = workbook.getSheetAt(sheet_num);
            int rows_in_sheet = sheet.getPhysicalNumberOfRows();
            
            //if sheet rows are less than number of rows to analyze then analyze all the rows
            if(rows_in_sheet<maxRows_ToAnalyze) {
                maxRows_ToAnalyze = rows_in_sheet;
            }
            
            //i=1 because we dont want to read header rows
            //header rows are typically strings
            for(int i=1; i<=maxRows_ToAnalyze; i++) {
                
                Row row = sheet.getRow(i);
                int column_count = row.getPhysicalNumberOfCells();

                for(int j=0; j<column_count; j++) {
                    
                    tempMap.putIfAbsent(j, new HashSet<>());

                    Cell cell = row.getCell(j);
                    
                    if(cell.getCellType().equals(CellType.NUMERIC)) {

                        Matcher m = p.matcher(cell.toString());
                        boolean match = m.find();
                        
                        if(match) {
                            tempMap.get(j).add(DATE);
                        } else {
                            tempMap.get(j).add(NUMERIC);
                        }
                        
                    } else if(cell.getCellType().equals(CellType.STRING)) {
                        tempMap.get(j).add(STRING);
                    } else if(cell.getCellType().equals(CellType.FORMULA)) {
                        tempMap.get(j).add(FORMULA);
                    } else if(cell.getCellType().equals(CellType.BLANK)) {
                        tempMap.get(j).add(BLANK);
                    } else if(cell.getCellType().equals(CellType.BOOLEAN)) {
                        tempMap.get(j).add(BOOLEAN);
                    } else if(cell.getCellType().equals(CellType.ERROR)) {
                        tempMap.get(j).add(ERROR);
                    }
                    
                }
                
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        for(int colnum: tempMap.keySet()) {
            if(tempMap.get(colnum).size()>1) {
                columnTypeMap.put(colnum, NOT_CONSISTENT);
            } else {
                for(String coltype: tempMap.get(colnum)) {
                    columnTypeMap.put(colnum, coltype);
                }
            }
        }

        return columnTypeMap;
    }
}
导入java.io.File;
导入java.io.FileInputStream;
导入java.util.HashMap;
导入java.util.HashSet;
导入java.util.Map;
导入java.util.Set;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入org.apache.poi.ss.usermodel.Cell;
导入org.apache.poi.ss.usermodel.CellType;
导入org.apache.poi.ss.usermodel.Row;
导入org.apache.poi.ss.usermodel.Sheet;
导入org.apache.poi.ss.usermodel.工作簿;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
公开课考试{
公共静态void main(字符串[]args){
String excelFileName=“C:\\Users\\test\\Downloads\\test.xlsx”;
int sheet_num=0;
int maxRows_ToAnalyze=5;
映射结果=analyzeColumnTypes(excelFileName、sheet_num、maxRows_to analyze);
for(int i:result.keySet()){
System.out.println(“列”+i+”的类型为==>“+result.get(i));
}
}
静态字符串NUMERIC=“NUMERIC”;
静态字符串DATE=“DATE”;
静态字符串String=“String”;
静态字符串公式=“公式”;
静态字符串BLANK=“BLANK”;
静态字符串BOOLEAN=“BOOLEAN”;
静态字符串ERROR=“ERROR”;
静态字符串不一致=“不一致”;
公共静态映射analyzeColumnTypes(字符串excelFileName、int sheet\u num、int maxRows\u ToAnalyze){
工作簿=空;
Map columnTypeMap=新建HashMap();
Map tempMap=newhashmap();
Pattern p=Pattern.compile(“[^0-9\\.]”,Pattern.CASE不区分大小写);
试一试{
FileInputStream excelFile=新FileInputStream(新文件(excelFileName));
工作簿=新XSSF工作簿(Excel文件);
工作表=工作簿.getSheetAt(工作表编号);
int rows_in_sheet=sheet.getPhysicalNumberOfRows();
//如果图纸行数小于要分析的行数,则分析所有行
如果(表中的行)