Apache POI: Принудительное использование типа ячеек данных? - PullRequest
0 голосов
/ 13 декабря 2018

Добавляя чистый текст из другого источника, я заметил, что Apache POI (3.17) автоматически предполагает, что строка, начинающаяся с =, интерпретируется как формула.Обычно это нормально, но как я могу убедиться, что в этом особом случае ячейка является НЕ формулой?

Я предположил, что после добавления строки, начинающейся с =, я могу просто сказать Apache POI, что тип равен CellType.STRING:

cell.setCellType(CellType.STRING);   

Но это не дает ожидаемого результата,Строка все еще читается как формула в выходном файле .xlsx (с использованием LibreOffice).В настоящее время я проверяю, начинается ли каждая добавленная строка с = и заменяет ее на '=, но я бы предпочел избежать всех этих проверок.Пример того, как я в настоящее время обрабатываю это:

strOut = in_CSV(i,j);
strOut = strOut.startsWith("=") ? "'"+strOut : strOut;

Так есть ли лучший способ убедиться, что мой вывод НЕ является форумом в Apache POI?

1 Ответ

0 голосов
/ 13 декабря 2018

Интерпретация строки, начинающейся с =, как формулы выполняется Excel или Calc после открытия файла.Таким образом, apache poi может предотвратить это, только если он использует те же маркеры в файле, которые Excel будет использовать для маркировки строк, начинающихся с =, а не формулы.Этот знак называется " префикс кавычки ".Он выглядит как апостроф в панели редактора Excel, но на самом деле не является частью содержимого ячейки.

Так что просто ставить апостроф перед содержимым ячейки будет неправильным подходом.Это работает при импорте текста (CSV) в Excel, потому что там главный апостроф будет автоматически интерпретироваться как префикс кавычки.Но в файле *.xls или *.xlsx этот автоматический режим не будет работать должным образом во всех случаях.Поэтому нам действительно нужно установить CellFormat.QuotePrefix Property, как Excel после ввода начального апострофа для содержимого ячейки в панели редактора.

Это можно сделать с помощью apache poi, создав CellStyle который установил setQuotePrefixed (true) .

...