Используйте результат формулы Excel в Java JXL API - PullRequest
1 голос
/ 08 марта 2012

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

import java.io.File;

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

public class CreateExcel
{

public static void main(String[] args) throws Exception
{
  Workbook workbook = Workbook.getWorkbook(new File("USA-IO-2005.xls"));
  WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"),
        workbook);
  copy.removeSheet(0);
  copy.removeSheet(2);
  WritableSheet domesticSheet = copy.getSheet(1);
  WritableSheet ASheet = copy.getSheet(0);

  for (int i = 8; i < 68; i++)
  {
     Formula f = new Formula(59, i - 1, "SUM(AX" + i + ":BE" + i
           + ") - BF" + i);
     domesticSheet.addCell(f);
  }

  double x;
  for (int i = 8; i < 68; i++)
  {
     NumberFormulaCell newCell = (NumberFormulaCell) domesticSheet.getCell(59, i);
     x = newCell.getValue();
     ASheet.addCell(new Label(1, i, String.valueOf(Double
           .valueOf(domesticSheet.getCell(1, i).getContents()) / x)));
  }
  copy.write();
  copy.close();
}
}

К сожалению, это дает мне следующее исключение:

Исключение в потоке "main" java.lang.ClassCastException: jxl.write.Formula не может быть приведено к jxl.NumberFormulaCell в CreateExcel.main (CreateExcel.java:31)

Кто-нибудь знает, как это должно быть сделано?

EDIT:

Это мой пересмотренный код, который, по сути, делает то, что я хочу, чтобы он выполнялся просто дольше. Я вычисляю, какой будет результат для формулы f, и сохраняю это, а не получаю прямой доступ к результату формулы.

import java.io.File;

import jxl.*;
import jxl.write.*;
import jxl.write.Number;
import jxl.SheetSettings;

public class CreateExcel
{

public static void main(String[] args) throws Exception
{
  Workbook workbook = Workbook.getWorkbook(new File("USA-IO-2005.xls"));
  WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"), workbook);
  copy.removeSheet(3);
  WritableSheet domesticSheet = copy.getSheet(2);
  WritableSheet ASheet = copy.getSheet(1);
  WritableSheet RDSheet = copy.getSheet(0);
  ASheet.setName("A Matrix");
  double x = 1;
  double[] xVals = new double[60];



  //WritableCellFormat cellFormat = new WritableCellFormat(new NumberFormat("#.########"));
  WritableCellFormat arial8format = new WritableCellFormat (new WritableFont(WritableFont.ARIAL, 8)); 
  ASheet.addCell(new Label(1, 3, "A Matrix", arial8format));

  for (int i = 8; i < 56; i++)
  {

     //Workaround: Gets the same result as formula f. Just wont update as numbers in excel are changed in the future 
     for (int j = 49; j < 57; j++)
        xVals[i - 8] += Double.valueOf(domesticSheet.getCell(j, i - 1).getContents());
     xVals[i - 8] -= Double.valueOf(domesticSheet.getCell(57, i - 1).getContents());

     Number num = new Number(60, i - 1, xVals[i - 8], arial8format);
     Formula f = new Formula(59, i - 1, "SUM(AX" + i + ":BE" + i + ") - BF" + i, arial8format);
     domesticSheet.addCell(f);
     domesticSheet.addCell(num);

     for (int j = 1; j < 49; j++)
     {
        ASheet.setColumnView(j, 10);
        if (xVals[i - 8] != 0)
           x = Double.valueOf(domesticSheet.getCell(j, i - 1).getContents()) / xVals[i - 8];
        else
           x = 0;
        ASheet.addCell(new Number(j, i - 1, x, arial8format));
     }

  }

  SheetSettings s = new SheetSettings(ASheet);
  s.setVerticalFreeze(1);
  s.setHorizontalFreeze(1);

  ASheet.removeRow(55);
  ASheet.removeRow(56);
  for(int i = 0; i < 6; i ++)
     ASheet.removeRow(0);

  domesticSheet.removeRow(55);
  domesticSheet.removeRow(56);
  for(int i = 0; i < 6; i ++)
     domesticSheet.removeRow(0);

  copy.write();
  copy.close();
}
}

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Исключение очевидно, вы не можете привести метод getCell() к NumberFormulaCell, он возвращает Cell интерфейс. Они отличаются интерфейсом. У меня есть изменения исходного кода ниже, у меня нет вашего исходного файла Excel, и поэтому я не могу его проверить, но это исключение приведения класса не должно быть проблемой сейчас. С этими изменениями, приведенными ниже, без исходного исходного файла Excel, строка с Sheet.addCell дает исключение на моей рабочей станции, но это совершенно другая проблема, чем та, о которой вы сообщили. Надеюсь, это сработает на вашем конце.

import java.io.File;

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

public class CreateExcel
{

    public static void main(String[] args) throws Exception
    {
        Workbook workbook = Workbook.getWorkbook(new File("USA-IO-2005.xls"));
        WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"), workbook);
        copy.removeSheet(0);
        copy.removeSheet(2);
        WritableSheet domesticSheet = copy.getSheet(1);
        WritableSheet ASheet = copy.getSheet(0);

        for (int i = 8; i < 68; i++)
        {
            Formula f = new Formula(59, i - 1, "SUM(AX" + i + ":BE" + i + ") - BF" + i);
            domesticSheet.addCell(f);
        }

        double x = 1;
        for (int i = 8; i < 68; i++)
        {
            Cell cell1 = domesticSheet.getCell(3, i);

            if (cell1.getType() == CellType.ERROR)
            {
                System.out.println("this cell is not exist!");
            }

            if (cell1.getType() == CellType.NUMBER)
            {
                NumberCell nc = (NumberCell)cell1;
                x = nc.getValue();
                System.out.println(x);
                ASheet.addCell(new Label(1, i, String.valueOf(Double.valueOf(domesticSheet.getCell(1, i).getContents()) / x)));
            }                           
        }
        copy.write();
        copy.close();
    }
}
0 голосов
/ 17 января 2018

Что ж, причина, по которой регистр if для CellType.Number не введен, заключается в том, что ячейка формулы не является числовой ячейкой.Это клетка формулы.Он не имеет «значения», кроме самой формулы (анализируется на имена функций для их токенизации, но не оценивается).И он возвращает CellType.ERROR (по крайней мере, в jxl 2.6.9).Библиотека создает файлы Excel с ячейками, она не оценивает формулу и даже не проверяет правильность синтаксиса.Он просто анализирует их для имен функций (токенов), поэтому I18N для имен функций работает.При чтении ячейки формулы из файла Excel, который был открыт, рассчитан и сохранен с помощью Excel , ячейка фумулы имеет CellType.NUMBER_FORMULA и реализует интерфейсы для чтения как формулы, так и результата формулы (какоценивается в excel).

Невозможно создать ячейку формулы, добавить ее на лист и сразу же прочитать результат.

...