2012-03-08 2 views
1

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

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(); 
} 
} 

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

Исключение в потоке «основной» java.lang.ClassCastException: jxl.write.Formula не может быть приведен к jxl.NumberFormulaCell at 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(); 
} 
} 
+1

Не могли бы вы сообщить нам, если это было решено? Это принесет пользу другим в сообществе ... – Mike

ответ

3

Исключение ясно, вы не можете отбрасывать возвращение метода 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

Yah Я знаю, что исключение показалось ясным, что я только что увидел пример с ним, подобным этому, поэтому я был смущен и искал правильный метод. Я пробовал свой код, но формула никогда не войдет в оператор if. Возможно, я недостаточно объяснил свою цель. У меня есть столбец, состоящий исключительно из формул. (SUM (AX *: BE *), где * - int). Я хочу взять вычисленное числовое значение каждой из этих ячеек, а не получать формулу или строку, представляющую эту формулу. –

+0

@ user1256415 Вы можете загрузить исходный файл, USA-IO-2005.xls где-нибудь со ссылкой, и поэтому я могу проверить его здесь? – Jasonw

+0

https://docs.google.com/spreadsheet/ccc?key=0AkBMdTFRb0T-dHFXTU5TMXI2c0FTTDRKSEJRZWVwRlE#gid=0 –

0

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

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

Смежные вопросы