diff --git a/src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java b/src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java index 823bafb3..f19794b2 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java @@ -1,9 +1,10 @@ package com.alibaba.excel.analysis.v07.handlers; -import org.xml.sax.Attributes; - import com.alibaba.excel.constant.ExcelXmlConstants; import com.alibaba.excel.context.xlsx.XlsxReadContext; +import com.alibaba.excel.util.PositionUtils; + +import org.xml.sax.Attributes; /** * Cell Handler @@ -15,9 +16,8 @@ public class CountTagHandler extends AbstractXlsxTagHandler { @Override public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) { String d = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_REF); - String totalStr = d.substring(d.indexOf(":") + 1, d.length()); - String c = totalStr.toUpperCase().replaceAll("[A-Z]", ""); - xlsxReadContext.readSheetHolder().setApproximateTotalRowNumber(Integer.parseInt(c)); + String totalStr = d.substring(d.indexOf(":") + 1); + xlsxReadContext.readSheetHolder().setApproximateTotalRowNumber(PositionUtils.getRow(totalStr) + 1); } } diff --git a/src/main/java/com/alibaba/excel/util/PositionUtils.java b/src/main/java/com/alibaba/excel/util/PositionUtils.java index a527ae1f..329e16e1 100644 --- a/src/main/java/com/alibaba/excel/util/PositionUtils.java +++ b/src/main/java/com/alibaba/excel/util/PositionUtils.java @@ -1,10 +1,20 @@ package com.alibaba.excel.util; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.poi.ss.util.CellReference; + /** * @author jipengfei */ public class PositionUtils { + private static final Pattern CELL_REF_PATTERN = Pattern.compile("(\\$?[A-Z]+)?" + "(\\$?[0-9]+)?", + Pattern.CASE_INSENSITIVE); + private static final char SHEET_NAME_DELIMITER = '!'; + private PositionUtils() {} public static int getRowByRowTagt(String rowTagt) { @@ -30,35 +40,37 @@ public class PositionUtils { } public static int getRow(String currentCellIndex) { - int row = 0; - if (currentCellIndex != null) { - String rowStr = currentCellIndex.replaceAll("[A-Z]", "").replaceAll("[a-z]", ""); - row = Integer.parseInt(rowStr) - 1; - } - return row; - } - - public static int getCol(String currentCellIndex) { - int col = 0; if (currentCellIndex != null) { - - char[] currentIndex = currentCellIndex.replaceAll("[0-9]", "").toCharArray(); - for (int i = 0; i < currentIndex.length; i++) { - col += (currentIndex[i] - '@') * Math.pow(26, (currentIndex.length - i - 1)); + int plingPos = currentCellIndex.lastIndexOf(SHEET_NAME_DELIMITER); + String cell = currentCellIndex.substring(plingPos + 1).toUpperCase(Locale.ROOT); + Matcher matcher = CELL_REF_PATTERN.matcher(cell); + if (!matcher.matches()) { + throw new IllegalArgumentException("Invalid CellReference: " + currentCellIndex); } + String row = matcher.group(2); + return Integer.parseInt(row) - 1; } - return col - 1; + return -1; } public static int getCol(String currentCellIndex, Integer before) { - int col = 0; if (currentCellIndex != null) { + int plingPos = currentCellIndex.lastIndexOf(SHEET_NAME_DELIMITER); + String cell = currentCellIndex.substring(plingPos + 1).toUpperCase(Locale.ROOT); + Matcher matcher = CELL_REF_PATTERN.matcher(cell); + if (!matcher.matches()) { + throw new IllegalArgumentException("Invalid CellReference: " + currentCellIndex); + } + String col = matcher.group(1); - char[] currentIndex = currentCellIndex.replaceAll("[0-9]", "").toCharArray(); - for (int i = 0; i < currentIndex.length; i++) { - col += (currentIndex[i] - '@') * Math.pow(26, (currentIndex.length - i - 1)); + if (col.length() > 0 && col.charAt(0) == '$') { + col = col.substring(1); + } + if (col.length() == 0) { + return -1; + } else { + return CellReference.convertColStringToIndex(col); } - return col - 1; } else { if (before == null) { before = -1; diff --git a/src/test/java/com/alibaba/easyexcel/test/temp/poi/PoiTest.java b/src/test/java/com/alibaba/easyexcel/test/temp/poi/PoiTest.java index 349e02c9..d56bd7b8 100644 --- a/src/test/java/com/alibaba/easyexcel/test/temp/poi/PoiTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/temp/poi/PoiTest.java @@ -39,8 +39,10 @@ public class PoiTest { SXSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); LOGGER.info("一共行数:{}", xssfSheet.getLastRowNum()); SXSSFRow row = xssfSheet.getRow(0); + LOGGER.info("dd{}",row.getCell(0).getColumnIndex()); Date date = row.getCell(1).getDateCellValue(); + } @Test @@ -51,6 +53,9 @@ public class PoiTest { XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); LOGGER.info("一共行数:{}", xssfSheet.getLastRowNum()); XSSFRow row = xssfSheet.getRow(0); + LOGGER.info("dd{}",row.getCell(0).getRow().getRowNum()); + LOGGER.info("dd{}",xssfSheet.getLastRowNum()); + Date date = row.getCell(1).getDateCellValue(); LOGGER.info("date{}",date); }