如何使用 docx4j 确定给定 excel sheet 的合并单元格范围?
How to Determine Merged Cells range for a given excel sheet using docx4j?
我想阅读具有一个合并列的 excel sheet,我需要处理该列以确定与之分组的行。这样我就可以将该组视为一个集合。同样,每个合并的行都被视为 set1、set2、set3 等。然后我将分别处理每个集合及其行。
更新:
应@fireandfuel 的要求,我包括了我已经到达的方法。
CTMergeCells mergeCells = workSheet.getMergeCells();
SheetData sheetData = workSheet.getSheetData();
List<ArrayList<Row>> rowGroups = new ArrayList<ArrayList<Row>>();
List<CTMergeCell> cTMergeCells = mergeCells.getMergeCell();
for(CTMergeCell mcells : cTMergeCells){
String range = mcells.getRef();
Integer rowStart = Integer.parseInt(range.substring(1, 2));
Integer rowEnd = Integer.parseInt(range.substring(4, 5));
ArrayList<Row> rowss = (ArrayList<Row>) sheetData.getRow().stream().filter(row -> {
return row.getR() >= rowStart.longValue() && row.getR() <= rowEnd.longValue();
}).collect(Collectors.toList());
rowGroups.add((ArrayList<Row>) rowss);
}
使用 docx4j 在 SpreadsheetML
中访问合并单元格的定义非常容易。
Office Open XML
文件(docx、xlsx 和 pptx)只是包含 XML 文件的 ZIP 压缩文件。你可以用最多的存档程序打开它,看看它的文件结构和文件。
下面是使用 docx4j 访问合并单元格定义的一些源代码:
// load yourFile.xlsx file
SpreadsheetMLPackage spreadsheetMLPackage = SpreadsheetMLPackage.load(new File("yourFile.xlsx"));
// get worksheet from /xl/worksheets/yourSheet.xml file from yourFile.xlsx
WorksheetPart worksheetPart = (WorksheetPart) spreadsheetMLPackage.getParts().get(new PartName("/xl/worksheets/yourSheet.xml"));
Worksheet worksheet = worksheetPart.getJaxbElement();
// get the merged cells
CTMergeCells ctMergedCells = worksheet.getMergeCells();
if(ctMergedCells != null){
List<CTMergeCell> mergedCellList = ctMergedCells.getMergeCell();
// do something with the merged cells
}
class org.xlsx4j.sml.CTMergeCell
有一个函数 getRef
,它为您提供合并为 String
、编码为 begin:end
的单元格的引用,例如A1:B2
(从 A1
到 B2
的合并单元格:A1
、A2
、B1
和 B2
)。
我想阅读具有一个合并列的 excel sheet,我需要处理该列以确定与之分组的行。这样我就可以将该组视为一个集合。同样,每个合并的行都被视为 set1、set2、set3 等。然后我将分别处理每个集合及其行。
更新: 应@fireandfuel 的要求,我包括了我已经到达的方法。
CTMergeCells mergeCells = workSheet.getMergeCells();
SheetData sheetData = workSheet.getSheetData();
List<ArrayList<Row>> rowGroups = new ArrayList<ArrayList<Row>>();
List<CTMergeCell> cTMergeCells = mergeCells.getMergeCell();
for(CTMergeCell mcells : cTMergeCells){
String range = mcells.getRef();
Integer rowStart = Integer.parseInt(range.substring(1, 2));
Integer rowEnd = Integer.parseInt(range.substring(4, 5));
ArrayList<Row> rowss = (ArrayList<Row>) sheetData.getRow().stream().filter(row -> {
return row.getR() >= rowStart.longValue() && row.getR() <= rowEnd.longValue();
}).collect(Collectors.toList());
rowGroups.add((ArrayList<Row>) rowss);
}
使用 docx4j 在 SpreadsheetML
中访问合并单元格的定义非常容易。
Office Open XML
文件(docx、xlsx 和 pptx)只是包含 XML 文件的 ZIP 压缩文件。你可以用最多的存档程序打开它,看看它的文件结构和文件。
下面是使用 docx4j 访问合并单元格定义的一些源代码:
// load yourFile.xlsx file
SpreadsheetMLPackage spreadsheetMLPackage = SpreadsheetMLPackage.load(new File("yourFile.xlsx"));
// get worksheet from /xl/worksheets/yourSheet.xml file from yourFile.xlsx
WorksheetPart worksheetPart = (WorksheetPart) spreadsheetMLPackage.getParts().get(new PartName("/xl/worksheets/yourSheet.xml"));
Worksheet worksheet = worksheetPart.getJaxbElement();
// get the merged cells
CTMergeCells ctMergedCells = worksheet.getMergeCells();
if(ctMergedCells != null){
List<CTMergeCell> mergedCellList = ctMergedCells.getMergeCell();
// do something with the merged cells
}
class org.xlsx4j.sml.CTMergeCell
有一个函数 getRef
,它为您提供合并为 String
、编码为 begin:end
的单元格的引用,例如A1:B2
(从 A1
到 B2
的合并单元格:A1
、A2
、B1
和 B2
)。