FormulaEvaluator в Apachie POI возвращает только нулевое значение - PullRequest
0 голосов
/ 26 сентября 2018

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


Ниже приведен мой код:

public final class Demo {

    public static void main(final String[] args) throws Exception {
        System.out.println(getCellValue());
}

    public static String getCellValue() throws Exception {
    final Workbook workBook = WorkbookFactory.create(new FileInputStream(new File("config.xlsx")));
        final Sheet sheet = workBook.getSheetAt(0);

        final Row row = sheet.getRow(1);
        final Cell cell = row.getCell(5);

        System.err.println(cell.getCellFormula());

        final FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
        final CellValue cellValue = evaluator.evaluate(cell);
        return cellValue.getStringValue();
        //Answer discovered instead of return "cellValue.getStringValue();" you must use only "return cellValue;"
    }
}



Когда я запускаю код, консоль показывает мне формулу, которая появляется в ячейке, но для значения она возвращает только null.Есть идеи, что я делаю не так?

TEXT(VLOOKUP((SUMIFS(A:A,B:B,"<="&G2,C:C,">="&G2)),A:C,2,0),"m/d/yyyy") null

РЕДАКТИРОВАТЬ: Обновлен код

    FileInputStream fis = new FileInputStream("config.xlsx");
    Workbook wb = new XSSFWorkbook(fis);
    Sheet sheet = wb.getSheetAt(0);
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

    CellReference cellReference = new CellReference("F2"); 
    Row row = sheet.getRow(cellReference.getRow());
    Cell cell = row.getCell(cellReference.getCol()); 

    CellValue cellValue = evaluator.evaluate(cell);

            System.out.println(cellValue.getCellType());
        //Answer discovered instead of return "System.out.println(cellValue.getCellType());" you must use only "System.out.println(cellValue);"
    wb.close();

1 Ответ

0 голосов
/ 27 сентября 2018

Извините, я не могу воспроизвести вашу проблему.Я скачал твой файл.Затем при запуске следующего кода:

import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.io.File;

class ReadExcelFormulaEvaluatorExample {

 static Workbook workBook;
 static Sheet sheet;
 static FormulaEvaluator evaluator;
 static DataFormatter formatter;

 static {
  try {
   workBook = WorkbookFactory.create(new FileInputStream(new File("config.xlsx")));
   sheet = workBook.getSheetAt(0);
   evaluator = workBook.getCreationHelper().createFormulaEvaluator();
   formatter = new DataFormatter();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }

 static CellValue getCellValue(int r, int c) throws Exception {
  Row row = sheet.getRow(r);
  Cell cell = row.getCell(c);
  System.err.println(cell.getCellFormula());
  CellValue cellValue = evaluator.evaluate(cell);
  return cellValue;
 }

 static String getCellContent(int r, int c) throws Exception {
  Row row = sheet.getRow(r);
  Cell cell = row.getCell(c);
  System.err.println(cell.getCellFormula());
  String cellContent = formatter.formatCellValue(cell, evaluator);

  return cellContent;
 }

 public static void main(String[] args) throws Exception {
  System.out.println("G2:");
  System.out.println(getCellValue(1, 6));

  System.out.println("Cell values:");
  for (int r = 1; r < 4; r++) {
   System.out.println(getCellValue(r, 5));
  }
  System.out.println("Cell contents:");

  for (int r = 1; r < 4; r++) {
   System.out.println(getCellContent(r, 5));
  }
  workBook.close();
 }
}

в среде: Java 8, apache poi 4.0.0.Он выдает следующие выходные данные:

axel@arichter:~/Dokumente/JAVA/poi/poi-4.0.0$ java -cp .:./*:./lib/*:./ooxml-lib/* ReadExcelFormulaEvaluatorExample 
G2:
TODAY()-1
org.apache.poi.ss.usermodel.CellValue [43369.0]
Cell values:
VLOOKUP(F4,A:C,2,0)
org.apache.poi.ss.usermodel.CellValue [43362.0]
VLOOKUP(F4,A:D,4,0)
org.apache.poi.ss.usermodel.CellValue ["Period 10"]
SUMIFS(A:A,B:B,"<="&G2,C:C,">="&G2)
org.apache.poi.ss.usermodel.CellValue [10.0]
Cell contents:
VLOOKUP(F4,A:C,2,0)
9/19/18
VLOOKUP(F4,A:D,4,0)
Period 10
SUMIFS(A:A,B:B,"<="&G2,C:C,">="&G2)
10

Кстати: все даты в B:B и C:C расположены в порядке возрастания, и между датой окончания в C:C и следующим началом в промежутке нет никаких пробелов.B:B, формулу

SUMIFS(A:A,B:B,"<="&G2,C:C,">="&G2)

можно заменить на

INDEX(A:A,MATCH(G2,B:B,1)).

...