如何使用 apache java poi 在 ms excel 中插入一个 table
How to insert a table in ms excel using apache java poi
我正在尝试使用 Java Apache Poi 在 Excel 中插入一个 table。但是当我打开 xlsx 文件时,它抛出以下错误,我无法解决它:
Removed Part: /xl/tables/table1.xml part with XML error. (Table) Load error. Line 2
repaired records: table from /xl/tables/table1.xml part (table)
我的代码如下:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyleInfo;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Architecture");
XSSFTable table = sheet.createTable();
CTTable cttable = table.getCTTable();
cttable.setDisplayName("Table1");
cttable.setId(1);
cttable.setName("Test");
cttable.setRef("A1:C11");
cttable.setTotalsRowShown(false);
CTTableStyleInfo styleInfo = cttable.addNewTableStyleInfo();
styleInfo.setShowColumnStripes(false);
styleInfo.setShowRowStripes(true);
CTTableColumns columns = cttable.addNewTableColumns();
columns.setCount(3);
for (int i = 1; i <= 3; i++) {
CTTableColumn column = columns.addNewTableColumn();
column.setId(i);
column.setName("Column" + i);
}
try (FileOutputStream outputStream = new FileOutputStream("C:\Office\TimeSheet\JavaBooks.xlsx")) {
workbook.write(outputStream);
}
}
}
如何使用 Apache Java Poi 在 Microsft Excel 中插入 table?
table 列名称的 sheet 个单元格中必须至少有内容。在您的情况下,sheet Architecture
中的单元格 A1:C1
必须有内容。在 apache poi
的旧版本中,此内容必须与 table 列名称匹配。在当前版本中,设置单元格内容会更新 table 列名称。
您的代码扩展后可以工作:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyleInfo;
public class ExcelTableTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Architecture");
XSSFTable table = sheet.createTable();
//XSSFTable table = sheet.createTable(null); //since apache poi 4.0.0
CTTable cttable = table.getCTTable();
cttable.setDisplayName("Table1");
cttable.setId(1);
cttable.setName("Test");
cttable.setRef("A1:C11");
cttable.setTotalsRowShown(false);
CTTableStyleInfo styleInfo = cttable.addNewTableStyleInfo();
styleInfo.setName("TableStyleMedium2");
styleInfo.setShowColumnStripes(false);
styleInfo.setShowRowStripes(true);
CTTableColumns columns = cttable.addNewTableColumns();
columns.setCount(3);
for (int i = 1; i <= 3; i++) {
CTTableColumn column = columns.addNewTableColumn();
column.setId(i);
column.setName("Column" + i);
}
for (int r = 0; r < 2; r++) {
XSSFRow row = sheet.createRow(r);
for(int c = 0; c < 3; c++) {
XSSFCell cell = row.createCell(c);
if(r == 0) { //first row is for column headers
cell.setCellValue("Column"+ (c+1)); //content **must** be here for table column names
} else {
//cell.setCellValue("Data R"+ (r+1) + "C" + (c+1));
}
}
}
try (FileOutputStream outputStream = new FileOutputStream("ExcelTableTest.xlsx")) {
workbook.write(outputStream);
}
}
}
除 'Axel Richter' 外,我还必须添加自动过滤器。当我用 ZipArchiv-software.
打开 Excel 时我意识到了
这是我使用的代码:
private void createCTTable(XSSFTable table)
{
cttable = table.getCTTable();
cttable.setDisplayName("Tabelle1");
cttable.setId(1);
cttable.setName("Test");
cttable.setTotalsRowShown(false);
AreaReference my_data_range = new AreaReference(new CellReference(0, 0),
new CellReference(rowVectors.size(), header.length - 1), SpreadsheetVersion.EXCEL2007);
cttable.setRef(my_data_range.formatAsString());
CTAutoFilter autofilter = cttable.addNewAutoFilter();
autofilter.setRef(my_data_range.formatAsString());
}
'header' 是一个包含字符串的数组,rowVectors 是一个对象集合,其中包含 table.
的 DataBody 的值
我使用 Apache Poi 4.1.1 .
如果 excel 文件打开时出现错误...。删除 part:t /xl/tables/table1。xml 并出现 XML 错误。
似乎是由 table1.xml
中的 table/tableColumn 部分重复引起的
可以使用略有不同的列名称进行修复 creations/setting
for (int i = 0; i <= REPORT_COL_COUNT; i++) {
String colName = sh.getRow(FIRST_DATA_ROW-1).getCell(i).getStringCellValue();
CTTableColumn column = columns.getTableColumnArray(i);
column.setName(colName);
}
使用 poi 5.2.2 测试
我正在尝试使用 Java Apache Poi 在 Excel 中插入一个 table。但是当我打开 xlsx 文件时,它抛出以下错误,我无法解决它:
Removed Part: /xl/tables/table1.xml part with XML error. (Table) Load error. Line 2
repaired records: table from /xl/tables/table1.xml part (table)
我的代码如下:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyleInfo;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Architecture");
XSSFTable table = sheet.createTable();
CTTable cttable = table.getCTTable();
cttable.setDisplayName("Table1");
cttable.setId(1);
cttable.setName("Test");
cttable.setRef("A1:C11");
cttable.setTotalsRowShown(false);
CTTableStyleInfo styleInfo = cttable.addNewTableStyleInfo();
styleInfo.setShowColumnStripes(false);
styleInfo.setShowRowStripes(true);
CTTableColumns columns = cttable.addNewTableColumns();
columns.setCount(3);
for (int i = 1; i <= 3; i++) {
CTTableColumn column = columns.addNewTableColumn();
column.setId(i);
column.setName("Column" + i);
}
try (FileOutputStream outputStream = new FileOutputStream("C:\Office\TimeSheet\JavaBooks.xlsx")) {
workbook.write(outputStream);
}
}
}
如何使用 Apache Java Poi 在 Microsft Excel 中插入 table?
table 列名称的 sheet 个单元格中必须至少有内容。在您的情况下,sheet Architecture
中的单元格 A1:C1
必须有内容。在 apache poi
的旧版本中,此内容必须与 table 列名称匹配。在当前版本中,设置单元格内容会更新 table 列名称。
您的代码扩展后可以工作:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyleInfo;
public class ExcelTableTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Architecture");
XSSFTable table = sheet.createTable();
//XSSFTable table = sheet.createTable(null); //since apache poi 4.0.0
CTTable cttable = table.getCTTable();
cttable.setDisplayName("Table1");
cttable.setId(1);
cttable.setName("Test");
cttable.setRef("A1:C11");
cttable.setTotalsRowShown(false);
CTTableStyleInfo styleInfo = cttable.addNewTableStyleInfo();
styleInfo.setName("TableStyleMedium2");
styleInfo.setShowColumnStripes(false);
styleInfo.setShowRowStripes(true);
CTTableColumns columns = cttable.addNewTableColumns();
columns.setCount(3);
for (int i = 1; i <= 3; i++) {
CTTableColumn column = columns.addNewTableColumn();
column.setId(i);
column.setName("Column" + i);
}
for (int r = 0; r < 2; r++) {
XSSFRow row = sheet.createRow(r);
for(int c = 0; c < 3; c++) {
XSSFCell cell = row.createCell(c);
if(r == 0) { //first row is for column headers
cell.setCellValue("Column"+ (c+1)); //content **must** be here for table column names
} else {
//cell.setCellValue("Data R"+ (r+1) + "C" + (c+1));
}
}
}
try (FileOutputStream outputStream = new FileOutputStream("ExcelTableTest.xlsx")) {
workbook.write(outputStream);
}
}
}
除 'Axel Richter' 外,我还必须添加自动过滤器。当我用 ZipArchiv-software.
打开 Excel 时我意识到了这是我使用的代码:
private void createCTTable(XSSFTable table)
{
cttable = table.getCTTable();
cttable.setDisplayName("Tabelle1");
cttable.setId(1);
cttable.setName("Test");
cttable.setTotalsRowShown(false);
AreaReference my_data_range = new AreaReference(new CellReference(0, 0),
new CellReference(rowVectors.size(), header.length - 1), SpreadsheetVersion.EXCEL2007);
cttable.setRef(my_data_range.formatAsString());
CTAutoFilter autofilter = cttable.addNewAutoFilter();
autofilter.setRef(my_data_range.formatAsString());
}
'header' 是一个包含字符串的数组,rowVectors 是一个对象集合,其中包含 table.
的 DataBody 的值我使用 Apache Poi 4.1.1 .
如果 excel 文件打开时出现错误...。删除 part:t /xl/tables/table1。xml 并出现 XML 错误。
似乎是由 table1.xml
中的 table/tableColumn 部分重复引起的可以使用略有不同的列名称进行修复 creations/setting
for (int i = 0; i <= REPORT_COL_COUNT; i++) {
String colName = sh.getRow(FIRST_DATA_ROW-1).getCell(i).getStringCellValue();
CTTableColumn column = columns.getTableColumnArray(i);
column.setName(colName);
}
使用 poi 5.2.2 测试