Java ApachePOI-Excel导入,将新工作表中的数据插入到列中
我来这里是为了在Netbeans中的java项目中寻求帮助 我正在使用ApachePOI导入/导出excel数据。为了让您了解我的应用程序中的问题,我向您展示了调试的打印 在印刷品中,您可以看到两张纸。第一个标题“aiai”和该表中的数据 我的问题是:如何将“aiai2”中的数据插入标题“aiai2”下方的适当位置,aiai2是excel文件中的第二张表 换言之,我想垂直分开这些表 下面,我将显示我的代码:Java ApachePOI-Excel导入,将新工作表中的数据插入到列中,java,excel,apache,Java,Excel,Apache,我来这里是为了在Netbeans中的java项目中寻求帮助 我正在使用ApachePOI导入/导出excel数据。为了让您了解我的应用程序中的问题,我向您展示了调试的打印 在印刷品中,您可以看到两张纸。第一个标题“aiai”和该表中的数据 我的问题是:如何将“aiai2”中的数据插入标题“aiai2”下方的适当位置,aiai2是excel文件中的第二张表 换言之,我想垂直分开这些表 下面,我将显示我的代码: Workbook wb; public String Importar(File a
Workbook wb;
public String Importar(File archivo, JTable tablaD) {
String answer = "Unable to import";
DefaultTableModel modeloT = new DefaultTableModel();
tablaD.setModel(modeloT);
tablaD.getModel();
tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
try {
wb = WorkbookFactory.create(new FileInputStream(archivo));
int nsheets = wb.getNumberOfSheets();
for (int i = 0; i < nsheets; i++) {
Sheet sheet = wb.getSheetAt(i);
Iterator filaIterator = sheet.rowIterator();
int rownum = -1;
while (filaIterator.hasNext()) {
rownum++;
Row fila = (Row) filaIterator.next();
/*if (i > 0) {//se o nr da ficha atual for maior que 0, começa a escrever as linhas apartir da row 0 da tabela
modeloT.moveRow(modeloT.getRowCount() -1, modeloT.getRowCount() - 1, 0);
}*/
Iterator columnaIterator = fila.cellIterator();
Object[] listaColumna = new Object[1000];
int columnnum = -1;
while (columnaIterator.hasNext()) {
columnnum++;
Cell celda = (Cell) columnaIterator.next();
if (rownum == 0) {
modeloT.addColumn(celda.getStringCellValue());
} else {
if (celda != null) {
switch (celda.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
listaColumna[columnnum] = (int) Math.round(celda.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
listaColumna[columnnum] = celda.getStringCellValue();
break;
case Cell.CELL_TYPE_BOOLEAN:
listaColumna[columnnum] = celda.getBooleanCellValue();
break;
default:
listaColumna[columnnum] = celda.getDateCellValue();
break;
}//end switch case
System.out.println("Column:" + columnnum + " Row:" + rownum + " value:" + celda + ".");
}
}
}//end while column Iterator
if (rownum != 0) {
modeloT.addRow(listaColumna);
}
}//end while row iterator
}//end for
answer = "Imported with success";
} catch (IOException | InvalidFormatException | EncryptedDocumentException e) {
System.err.println(e.getMessage());
}
return answer;
}
public String Exportar(File archivo, JTable tablaD) {
String answer = "Unable to export";
int numFila = tablaD.getRowCount(), numColumna = tablaD.getColumnCount();
if (archivo.getName().endsWith("xls")) {
wb = new HSSFWorkbook();
} else {
wb = new XSSFWorkbook();
}
Sheet hoja = wb.createSheet("Default");
try {
for (int i = -1; i < numFila; i++) {
Row fila = hoja.createRow(i + 1);
for (int j = 0; j < numColumna; j++) {
Cell celda = fila.createCell(j);
if (i == -1) {
celda.setCellValue(String.valueOf(tablaD.getColumnName(j)));
} else {
celda.setCellValue(String.valueOf(tablaD.getValueAt(i, j)));
}
wb.write(new FileOutputStream(archivo));
}
}
answer = "Exported with success";
} catch (Exception e) {
System.err.println(e.getMessage());
}
return answer;
}
工作簿wb;
公共字符串导入器(文件archivo,JTable tablaD){
字符串answer=“无法导入”;
DefaultTableModelot=新的DefaultTableModel();
tablaD.setModel(modeloT);
tablaD.getModel();
tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
试一试{
wb=WorkbookFactory.create(新文件输入流(archivo));
int nsheets=wb.getNumberOfSheets();
for(int i=0;i0){//se o nr da ficha atual代表0,那么作为第0行的一部分,请在第0行的表中列出
modeloT.moveRow(modeloT.getRowCount()-1,modeloT.getRowCount()-1,0);
}*/
迭代器columnaIterator=fila.cellIterator();
Object[]listaColumna=新对象[1000];
int columnnum=-1;
while(columnaIterator.hasNext()){
columnnum++;
Cell celda=(Cell)columnaIterator.next();
如果(rownum==0){
modeloT.addColumn(celda.getStringCellValue());
}否则{
if(celda!=null){
开关(celda.getCellType()){
case Cell.Cell\u类型\u数值:
listaColumna[columnnum]=(int)Math.round(celda.getNumericCellValue());
打破
case Cell.Cell\u类型\u字符串:
listaColumna[columnnum]=celda.getStringCellValue();
打破
case Cell.Cell\u类型\u布尔值:
listaColumna[columnnum]=celda.getBooleanCellValue();
打破
违约:
listaColumna[columnnum]=celda.getDateCellValue();
打破
}//末端开关盒
System.out.println(“列:+columnnum+”行:+rownum+”值:+celda+”);
}
}
}//边结束边列迭代器
如果(rownum!=0){
modeloT.addRow(listaColumna);
}
}//行迭代器时结束
}//结束
回答=“导入成功”;
}捕获(IOException | InvalidFormatException | EncryptedDocumentException e){
System.err.println(e.getMessage());
}
返回答案;
}
公共字符串导出器(文件archivo,JTable tablaD){
字符串answer=“无法导出”;
int numFila=tablaD.getRowCount(),numColumna=tablaD.getColumnCount();
if(archivo.getName().endsWith(“xls”)){
wb=新的HSSF工作手册();
}否则{
wb=新XSSFWorkbook();
}
Sheet hoja=wb.createSheet(“默认”);
试一试{
for(inti=-1;i
根据我对您问题的理解,我假设您希望为每张工作表创建一个单独的表格,一个在另一个下面。在这种情况下,每次阅读新工作表时都需要创建一个新表。如果只使用一个表,则只会得到一个标题
试试这个:
创建一个新方法Importar
,该方法接受一个新表和一个工作表
参数
public String Importar(JTable tablaD, Sheet sheet) {
String answer = "Unable to import";
DefaultTableModel modeloT = new DefaultTableModel();
tablaD.setModel(modeloT);
tablaD.getModel();
tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
try {
Iterator filaIterator = sheet.rowIterator();
int rownum = -1;
....
....
因此,调用方法将是:
try {
Workbook wb = WorkbookFactory.create(new FileInputStream(archivo));
int nsheets = wb.getNumberOfSheets();
for (int i = 0; i < nsheets; i++) {
//You have to make sure your JTable gets rendered.
JTable tablaD = new JTable();
Importar( tablaD, wb.getSheetAt(i) );
}
} catch ( Exception e ) {
e.printStackTrace();
}
试试看{
工作簿wb=WorkbookFactory.create(新文件输入流(archivo));
int nsheets=wb.getNumberOfSheets();
for(int i=0;i
重要的一点是,每次调用
Importar
之前,您的新表都需要渲染或添加到帧中。我尝试了我们的方法,但在我的控制器modeloE.Importar(archivo,vistaE.jtDatos)中出现了一个错误,因为我删除了JTable参数,所以我还必须删除“vistaE.jtDatos”错误消失了,但是,当我导入excel文件时,它没有显示任何数据,它是空白的。但是,在控制台中,数据正在添加到表中。在调用Importar
之前,您似乎正在将JTable
添加到帧中,请不要干扰现有方法,只需按照我的ans中的建议创建一个新方法