Java 如何使用ApachePOI4.X读取Excel(xlsx)标题列数据类型
我一直在努力寻找读取每个标题列的数据类型的方法。 我使用ApachePOI4.1.2读取XLSX文件格式,使用 XSSF工作簿实现 业务用例:我有一个包含22个单元格的excel(包括字符串、数字、日期字段) 如果用户试图将日期字段修改为字符串或将数字字段修改为字符串,反之亦然。我需要在不读取数据行的情况下抛出errow。图格 h我能够处理数据行,以防用户修改类型(日期值为varchar,数字为String) Sudo代码段: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
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();
//如果图纸行数小于要分析的行数,则分析所有行
如果(表中的行)