Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,27 +1,52 @@
package cn.idev.excel.analysis.v07.handlers;

import cn.idev.excel.constant.ExcelXmlConstants;
import cn.idev.excel.context.xlsx.XlsxReadContext;
import cn.idev.excel.metadata.data.FormulaData;
import cn.idev.excel.read.metadata.holder.xlsx.XlsxReadSheetHolder;
import cn.idev.excel.util.StringUtils;
import org.xml.sax.Attributes;

/**
* Cell Handler
*
* Cell formula tag handler
*/
public class CellFormulaTagHandler extends AbstractXlsxTagHandler {

@Override
public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) {
XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder();
xlsxReadSheetHolder.setTempFormula(new StringBuilder());
xlsxReadSheetHolder.setTempSharedIndex(null);

// shared formula
String t = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_T);
if (StringUtils.isBlank(t) || !ExcelXmlConstants.ATTRIBUTE_SHARED.equals(t)) {
return;
}
String si = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_SHARED_INDEX);
if (StringUtils.isBlank(si)) {
return;
}
xlsxReadSheetHolder.setTempSharedIndex(si);
}

@Override
public void endElement(XlsxReadContext xlsxReadContext, String name) {
XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder();

String formulaValue = xlsxReadSheetHolder.getTempFormula().toString();
String sharedIndex = xlsxReadSheetHolder.getTempSharedIndex();

if (StringUtils.isNotBlank(sharedIndex)) {
if (StringUtils.isNotBlank(formulaValue)) {
xlsxReadSheetHolder.getSharedFormula().putIfAbsent(sharedIndex, formulaValue);
} else {
formulaValue = xlsxReadSheetHolder.getSharedFormula().get(sharedIndex);
}
}

FormulaData formulaData = new FormulaData();
formulaData.setFormulaValue(xlsxReadSheetHolder.getTempFormula().toString());
formulaData.setFormulaValue(formulaValue);
xlsxReadSheetHolder.getTempCellData().setFormulaData(formulaData);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,16 @@ public class ExcelXmlConstants {
*/
public static final String ATTRIBUTE_RID = "r:id";

/**
* shared attribute
*/
public static final String ATTRIBUTE_SHARED = "shared";

/**
* shared attribute index
*/
public static final String ATTRIBUTE_SHARED_INDEX = "si";

/**
* Cell range split
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import cn.idev.excel.read.metadata.holder.ReadWorkbookHolder;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
Expand Down Expand Up @@ -35,6 +37,15 @@ public class XlsxReadSheetHolder extends ReadSheetHolder {
* Formula for current label.
*/
private StringBuilder tempFormula;
/**
* Shared index for current label.
*/
private String tempSharedIndex;
/**
* Shared formula for current sheet.
*/
private Map<String, String> sharedFormula;

/**
* excel Relationship
*/
Expand All @@ -43,6 +54,7 @@ public class XlsxReadSheetHolder extends ReadSheetHolder {
public XlsxReadSheetHolder(ReadSheet readSheet, ReadWorkbookHolder readWorkbookHolder) {
super(readSheet, readWorkbookHolder);
this.tagDeque = new LinkedList<String>();
this.sharedFormula = new ConcurrentHashMap<>();
packageRelationshipCollection = ((XlsxReadWorkbookHolder) readWorkbookHolder)
.getPackageRelationshipCollectionMap()
.get(readSheet.getSheetNo());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package cn.idev.excel.celldata;

import cn.idev.excel.FastExcel;
import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.event.AnalysisEventListener;
import cn.idev.excel.metadata.data.FormulaData;
import cn.idev.excel.metadata.data.WriteCellData;
import cn.idev.excel.util.DateUtils;
Expand All @@ -10,26 +12,28 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

/**
*
*/
@TestMethodOrder(MethodOrderer.MethodName.class)
@Slf4j
public class CellDataDataTest {

private static File file07;
private static File file03;
private static File fileCsv;
private static File file07_formula;

@BeforeAll
public static void init() {
file07 = TestFileUtil.createNewFile("cellData07.xlsx");
file03 = TestFileUtil.createNewFile("cellData03.xls");
fileCsv = TestFileUtil.createNewFile("cellDataCsv.csv");
fileCsv = TestFileUtil.readFile("cellDataCsv.csv");
file07_formula = TestFileUtil.readFile("celldata" + File.separator + "celldata_formula.xlsx");
}

@Test
Expand All @@ -47,6 +51,24 @@ public void t03ReadAndWriteCsv() throws Exception {
readAndWrite(fileCsv);
}

@Test
public void t04ReadFormula07() throws Exception {
FastExcel.read(file07_formula, CellDataReadData.class, new AnalysisEventListener<CellDataReadData>() {
@Override
public void invoke(CellDataReadData data, AnalysisContext context) {
Assertions.assertNotNull(
data.getFormulaValue().getFormulaData().getFormulaValue());
log.info(
"row formula: {}",
data.getFormulaValue().getFormulaData().getFormulaValue());
}

@Override
public void doAfterAllAnalysed(AnalysisContext context) {}
})
.doReadAll();
}

private void readAndWrite(File file) throws Exception {
FastExcel.write(file, CellDataWriteData.class).sheet().doWrite(data());
FastExcel.read(file, CellDataReadData.class, new CellDataDataListener())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
import lombok.Getter;
import lombok.Setter;

/**
*
*/
@Getter
@Setter
@EqualsAndHashCode
Expand Down
Binary file not shown.