forked from fanruan/easyexcel
Jiaju Zhuang
3 years ago
11 changed files with 268 additions and 161 deletions
@ -0,0 +1,112 @@ |
|||||||
|
package com.alibaba.excel.analysis.csv; |
||||||
|
|
||||||
|
import java.io.FileReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.LinkedHashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.excel.analysis.ExcelReadExecutor; |
||||||
|
import com.alibaba.excel.context.csv.CsvReadContext; |
||||||
|
import com.alibaba.excel.enums.CellDataTypeEnum; |
||||||
|
import com.alibaba.excel.enums.RowTypeEnum; |
||||||
|
import com.alibaba.excel.exception.ExcelAnalysisException; |
||||||
|
import com.alibaba.excel.metadata.Cell; |
||||||
|
import com.alibaba.excel.metadata.data.ReadCellData; |
||||||
|
import com.alibaba.excel.read.metadata.ReadSheet; |
||||||
|
import com.alibaba.excel.read.metadata.holder.ReadRowHolder; |
||||||
|
import com.alibaba.excel.read.metadata.holder.csv.CsvReadWorkbookHolder; |
||||||
|
import com.alibaba.excel.util.SheetUtils; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.apache.commons.collections4.MapUtils; |
||||||
|
import org.apache.commons.csv.CSVFormat; |
||||||
|
import org.apache.commons.csv.CSVRecord; |
||||||
|
|
||||||
|
/** |
||||||
|
* azz |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
public class CsvExcelReadExecutor implements ExcelReadExecutor { |
||||||
|
|
||||||
|
private List<ReadSheet> sheetList; |
||||||
|
private CsvReadContext csvReadContext; |
||||||
|
|
||||||
|
public CsvExcelReadExecutor(CsvReadContext csvReadContext) { |
||||||
|
this.csvReadContext = csvReadContext; |
||||||
|
sheetList = new ArrayList<>(); |
||||||
|
ReadSheet readSheet = new ReadSheet(); |
||||||
|
sheetList.add(readSheet); |
||||||
|
readSheet.setSheetNo(0); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ReadSheet> sheetList() { |
||||||
|
return sheetList; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void execute() { |
||||||
|
Iterable<CSVRecord> parseRecords; |
||||||
|
try { |
||||||
|
parseRecords = parseRecords(); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new ExcelAnalysisException(e); |
||||||
|
} |
||||||
|
for (ReadSheet readSheet : sheetList) { |
||||||
|
readSheet = SheetUtils.match(readSheet, csvReadContext); |
||||||
|
if (readSheet == null) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
csvReadContext.currentSheet(readSheet); |
||||||
|
|
||||||
|
int rowIndex = 0; |
||||||
|
for (CSVRecord record : parseRecords) { |
||||||
|
|
||||||
|
dealRecord(record, rowIndex++); |
||||||
|
} |
||||||
|
// The last sheet is read
|
||||||
|
csvReadContext.analysisEventProcessor().endSheet(csvReadContext); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private Iterable<CSVRecord> parseRecords() throws IOException { |
||||||
|
CsvReadWorkbookHolder csvReadWorkbookHolder = csvReadContext.csvReadWorkbookHolder(); |
||||||
|
CSVFormat csvFormat = csvReadWorkbookHolder.getCsvFormat(); |
||||||
|
|
||||||
|
if (csvReadWorkbookHolder.getMandatoryUseInputStream()) { |
||||||
|
return csvFormat.parse(new InputStreamReader(csvReadWorkbookHolder.getInputStream())); |
||||||
|
} |
||||||
|
if (csvReadWorkbookHolder.getFile() != null) { |
||||||
|
return csvFormat.parse(new FileReader(csvReadWorkbookHolder.getFile())); |
||||||
|
} |
||||||
|
return csvFormat.parse(new InputStreamReader(csvReadWorkbookHolder.getInputStream())); |
||||||
|
} |
||||||
|
|
||||||
|
private void dealRecord(CSVRecord record, int rowIndex) { |
||||||
|
Map<Integer, Cell> cellMap = new LinkedHashMap<>(); |
||||||
|
Iterator<String> cellIterator = record.iterator(); |
||||||
|
int cellIndex = 0; |
||||||
|
while (cellIterator.hasNext()) { |
||||||
|
String cellString = cellIterator.next(); |
||||||
|
ReadCellData<String> readCellData = new ReadCellData<>(); |
||||||
|
readCellData.setType(CellDataTypeEnum.STRING); |
||||||
|
readCellData.setStringValue(cellString); |
||||||
|
cellMap.put(cellIndex++, readCellData); |
||||||
|
} |
||||||
|
|
||||||
|
RowTypeEnum rowType = MapUtils.isEmpty(cellMap) ? RowTypeEnum.EMPTY : RowTypeEnum.DATA; |
||||||
|
ReadRowHolder readRowHolder = new ReadRowHolder(rowIndex, rowType, |
||||||
|
csvReadContext.readWorkbookHolder().getGlobalConfiguration(), cellMap); |
||||||
|
csvReadContext.readRowHolder(readRowHolder); |
||||||
|
|
||||||
|
csvReadContext.csvReadSheetHolder().setCellMap(cellMap); |
||||||
|
csvReadContext.csvReadSheetHolder().setRowIndex(rowIndex); |
||||||
|
csvReadContext.analysisEventProcessor().endRow(csvReadContext); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.alibaba.excel.context.csv; |
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContext; |
||||||
|
import com.alibaba.excel.read.metadata.holder.csv.CsvReadSheetHolder; |
||||||
|
import com.alibaba.excel.read.metadata.holder.csv.CsvReadWorkbookHolder; |
||||||
|
|
||||||
|
/** |
||||||
|
* A context is the main anchorage point of a ls xls reader. |
||||||
|
* |
||||||
|
* @author Jiaju Zhuang |
||||||
|
**/ |
||||||
|
public interface CsvReadContext extends AnalysisContext { |
||||||
|
/** |
||||||
|
* All information about the workbook you are currently working on. |
||||||
|
* |
||||||
|
* @return Current workbook holder |
||||||
|
*/ |
||||||
|
CsvReadWorkbookHolder csvReadWorkbookHolder(); |
||||||
|
|
||||||
|
/** |
||||||
|
* All information about the sheet you are currently working on. |
||||||
|
* |
||||||
|
* @return Current sheet holder |
||||||
|
*/ |
||||||
|
CsvReadSheetHolder csvReadSheetHolder(); |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.alibaba.excel.context.csv; |
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContextImpl; |
||||||
|
import com.alibaba.excel.read.metadata.ReadWorkbook; |
||||||
|
import com.alibaba.excel.read.metadata.holder.csv.CsvReadSheetHolder; |
||||||
|
import com.alibaba.excel.read.metadata.holder.csv.CsvReadWorkbookHolder; |
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum; |
||||||
|
|
||||||
|
/** |
||||||
|
* A context is the main anchorage point of a ls xls reader. |
||||||
|
* |
||||||
|
* @author Jiaju Zhuang |
||||||
|
*/ |
||||||
|
public class DefaultCsvReadContext extends AnalysisContextImpl implements CsvReadContext { |
||||||
|
|
||||||
|
public DefaultCsvReadContext(ReadWorkbook readWorkbook, ExcelTypeEnum actualExcelType) { |
||||||
|
super(readWorkbook, actualExcelType); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public CsvReadWorkbookHolder csvReadWorkbookHolder() { |
||||||
|
return (CsvReadWorkbookHolder)readWorkbookHolder(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public CsvReadSheetHolder csvReadSheetHolder() { |
||||||
|
return (CsvReadSheetHolder)readSheetHolder(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.holder.csv; |
||||||
|
|
||||||
|
import com.alibaba.excel.read.metadata.ReadSheet; |
||||||
|
import com.alibaba.excel.read.metadata.holder.ReadSheetHolder; |
||||||
|
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author Jiaju Zhuang |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class CsvReadSheetHolder extends ReadSheetHolder { |
||||||
|
|
||||||
|
public CsvReadSheetHolder(ReadSheet readSheet, ReadWorkbookHolder readWorkbookHolder) { |
||||||
|
super(readSheet, readWorkbookHolder); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.holder.csv; |
||||||
|
|
||||||
|
import com.alibaba.excel.read.metadata.ReadWorkbook; |
||||||
|
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; |
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import org.apache.commons.csv.CSVFormat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Workbook holder |
||||||
|
* |
||||||
|
* @author Jiaju Zhuang |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class CsvReadWorkbookHolder extends ReadWorkbookHolder { |
||||||
|
|
||||||
|
private CSVFormat csvFormat; |
||||||
|
|
||||||
|
public CsvReadWorkbookHolder(ReadWorkbook readWorkbook) { |
||||||
|
super(readWorkbook); |
||||||
|
setExcelType(ExcelTypeEnum.CSV); |
||||||
|
csvFormat = CSVFormat.DEFAULT; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue