Проблемы с копированием листов Excel с помощью API JExcel - PullRequest
7 голосов
/ 01 апреля 2012

Я работал над некоторыми довольно сложными файлами Excel и столкнулся с проблемой при копировании листов.Всякий раз, когда я пытаюсь скопировать не полностью пустой лист, я получаю следующее сообщение:

Exception in thread "main" java.lang.NullPointerException
     at jxl.write.biff.WritableSheetCopier.shallowCopyCells(WritableSheetCopier.java:499)
     at jxl.write.biff.WritableSheetCopier.copySheet(WritableSheetCopier.java:239)
     at jxl.write.biff.WritableSheetImpl.copy(WritableSheetImpl.java:1622)
     at jxl.write.biff.WritableWorkbookImpl.copySheet(WritableWorkbookImpl.java:987)
     at excelCalc.main(excelCalc.java:18)

Мне интересно, в чем здесь проблема.Зачем вообще нужна функция ".copySheet ("), если ее нельзя использовать для листов с информацией в них. В попытке воспроизвести проблему в более простом масштабе я создал код, который вы видите ниже. Выходные данные, которые я ожидаю получитьсм. 2 идентичных листа с ячейкой (0,0), имеющей метку «тест». Один лист называется «Потоки», другой - «копия». Есть идеи относительно того, почему это дает этот нулевой указатель?

import java.io.File;

import jxl.*;
import jxl.write.*;

public class excelCalc
{
    public static void main(String[] args) throws Exception
    {
        WritableWorkbook outputBook = Workbook.createWorkbook(new File("C:/Users/Kevin Brey/CS243/ExcelTest/files/output", "output.xls"));

        WritableSheet rSheet = outputBook.createSheet("Flows", 0);

        rSheet.addCell(new Label(0, 0, "test"));
        outputBook.copySheet(0, "copy", 0);
        outputBook.write();
        outputBook.close();
    }
}

РЕДАКТИРОВАТЬ: Этот код также дает то же исключение:

import java.io.File;

import jxl.*;
import jxl.write.*;

public class excelCalc
{
    public static void main(String[] args) throws Exception
    {
        WritableWorkbook outputBook = Workbook.createWorkbook(new File("C:/Users/Kevin Brey/CS243/ExcelTest/files/output", "output.xls"));

        WritableSheet sheet1 = outputBook.createSheet("Sheet1", 0);
        WritableSheet sheet2 = outputBook.createSheet("Sheet2", 1);

        sheet1.addCell(new Label(0, 0, "Label1"));
        sheet2.addCell(new Label(0, 0, "Label2"));

        outputBook.copySheet(0, "Copy", 1);

        outputBook.write();
        outputBook.close();
    }
}

Одна из моих идей о том, что может быть не так, заключается в том, что, поскольку лист открыт и отредактирован, его нельзя скопировать.не знаю, как обойти это, хотя.

Ответы [ 2 ]

10 голосов
/ 11 апреля 2012

Это ошибка в jxl-2.6.12.jar, используйте вместо нее jxl-2.6.10.jar.

Подробности:

опечатка '&&' в '&'

строка 493 - строка 504 в WritableSheetCopier.java

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 - строка 551 в WritableSheetCopier.java

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 - строка 1001 в SheetCopier.java

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);
            }
          }
0 голосов
/ 01 апреля 2012

лист для копирования пуст, добавьте несколько ячеек на лист для копирования перед копированием

...