使用JExcelApi导入工作表

时间:2012-03-12 20:32:28

标签: java jexcelapi

首先让我说我对Java和这个网站都很新。我现在读了一两本书,从那以后一直在寻找小项目以保持自己的娱乐。我试图研究这个,但我找不到我需要的信息。话虽如此,这是我在这里的第一个问题,所以如果这是非常早期的初学者的东西而且我遗漏了一些显而易见的东西我道歉。

关于这个项目,我的姐夫在工作中有一个问题,他在一个文件夹中有90个左右的Excel工作簿,他需要将每个报告的第一个工作表合并到一个主工作簿中。他可以手动完成,但我认为尝试找出一种使用Java的方法会很有趣。

我做了一些研究并下载了JExcelAPI并将.jar添加到了我的类路径中。我在我的电脑上创建了两个目录。

C:\ EXCEL \

C:\ EXCEL \成品\

在C:\ Excel \里面我创建了两个虚拟excel表。为了测试目的,我已经将每个表上的第一张表重命名。在已完成的文件夹中,我创建了我打算将这些工作表合并到的主文档。当工作表为空并且我运行时,工作表似乎被复制了。主文件中有两个页面,它们的名称与我在各自工作簿中给出的名称相对应,因此我认为这是有效的。但是,当我向其中一个工作表添加信息并尝试运行它时,我得到一个空指针异常。我已经在这个工作了好几个小时,所以也许我只是需要休息一下,但我无法弄清楚出了什么问题。我去了JExcelAPI的网站,尝试了看起来像过时的方法(在importSheet()存在之前)。这也不起作用,并返回空指针异常。

如果有人有时间并且熟悉JExcelAPI,你能告诉我什么是错的吗?我真的很感激。我在下面发布了错误和我的代码。

- 错误 -

spreadsheet1.xls
Exception in thread "main" java.lang.NullPointerException
at jxl.write.biff.SheetCopier.deepCopyCells(SheetCopier.java:996)
at jxl.write.biff.SheetCopier.importSheet(SheetCopier.java:542)
at jxl.write.biff.WritableSheetImpl.importSheet(WritableSheetImpl.java:2699)
at jxl.write.biff.WritableWorkbookImpl.importSheet(WritableWorkbookImpl.java:1897)
at sheetcopier.SheetCopier.main(SheetCopier.java:32)

- 代码 -

package sheetcopier;

import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.nio.file.Paths;
import jxl.*;
import jxl.read.biff.BiffException;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class SheetCopier {

public static void main(String[] args) throws WriteException, BiffException {
    Path inputpath = Paths.get("C:/Excel"); //Directory with excel documents to be copied
    File outputfile = new File("C:/ExcelFinished/finishedbook.xls"); //Master/End file

    //Read all files from directory
    try (DirectoryStream<Path> inputfiles = Files.newDirectoryStream(inputpath)){

        //Get a writable workbook
        WritableWorkbook writableworkbook = Workbook.createWorkbook(outputfile);            

        for(Path path: inputfiles)
        {
            Workbook sourceworkbook = Workbook.getWorkbook(path.toFile()); //Get the source workbook
            System.out.println(path.getFileName()); //Print workbook being processed
            Sheet readablesheet = sourceworkbook.getSheet(0); //Get the first sheet
            writableworkbook.importSheet(readablesheet.getName(), 0, readablesheet); //Import the sheet into the new workbook
            //Sheet names are imported if sheets are empty.  If sheets are populated I get a null pointer error.
        }

        writableworkbook.write();
        writableworkbook.close();
    }
    catch(NotDirectoryException e) {
        System.err.println(inputpath + " is not a directory." + e);
    }
    catch(IOException e) {
        System.err.println("I/O error." + e);
    }
}
}

1 个答案:

答案 0 :(得分:5)

这是jxl-2.6.12.jar中的一个错误,请使用jxl-2.6.10.jar。

详细说明:

错字'&amp;&amp;'进入'&amp;'

第493行 - WritableSheetCopier.java中的第504行

if (c != null)
          {
            toSheet.addCell(c);

            // Cell.setCellFeatures short circuits when the cell is copied,
            // so make sure the copy logic handles the validated cells        
            if (c.getCellFeatures() != null &
                c.getCellFeatures().hasDataValidation())
            {
              validatedCells.add(c);
            }
          }

第540行 - WritableSheetCopier.java中的第551行

if (c != null)
          {
            toSheet.addCell(c);

            // Cell.setCellFeatures short circuits when the cell is copied,
            // so make sure the copy logic handles the validated cells        
            if (c.getCellFeatures() != null &
                c.getCellFeatures().hasDataValidation())
            {
              validatedCells.add(c);
            } 
          }

第990行 - SheetCopier.java中的第1001行

if (c != null)
          {
            toSheet.addCell(c);

            // Cell.setCellFeatures short circuits when the cell is copied,
            // so make sure the copy logic handles the validated cells
            if (c.getCellFeatures() != null &
                c.getCellFeatures().hasDataValidation())
            {
              validatedCells.add(c);
            }
          }