Excel POI API изменяет значение ячейки - PullRequest
1 голос
/ 15 марта 2012

Мне нужно прочитать файл Excel и заполнить некоторые ячейки API POI для JAVA. Я пишу всю книгу в другую. Это на самом деле работает.

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

Код такой:

cellHorasPrevistas.setCellValue("01:00:00")

Когда я вхожу в файл xls, он выглядит как необработанная строка, а не форматируется как «[h]: mm: ss», который был исходным форматом ячейки.

Я пытался переписать формат вручную, но он не работал:

    HSSFCellStyle cs = wb.createCellStyle();
    HSSFDataFormat df = wb.createDataFormat();
    cs.setDataFormat(df.getFormat("[h]:mm:ss"));
    cellHorasPrevistas.setCellStyle(cs);
    cellHorasPrevistas.setCellValue("01:00:00")

Я тоже пытался не повезло

HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); 
fe.clearAllCachedResultValues()
fe.notifyUpdateCell(cellHorasPrevistas)
fe.evaluate(cellHorasPrevistas)

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

Заранее спасибо, Raúl

Нашел частичное объяснение .... Проблема в том, что de CellType меняется с числа на String, и поэтому Excel не может использовать его в формулах. Я хочу сохранить числовой формат, задав значение «12:00:00», а не 0,5. Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Вы можете попробовать использовать Date или Calendar -Object для установки значения, а не String.Возможно, вам придется создать фиктивный объект, для которого установлено только соответствующее время.

Мне пришлось установить ГОД на 1970, от Месяца до января и День на 1, чтобы он работал следующим образом:

  HSSFWorkbook wb = new HSSFWorkbook();
  HSSFRow row = wb.createSheet().createRow(0);
  CellStyle cellStyle = wb.createCellStyle();
  cellStyle.setDataFormat(wb.getCreationHelper().createDataFormat().getFormat("HH:mm:ss"));
  HSSFCell cell = row.createCell(1);
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.YEAR, 1970);
  cal.set(Calendar.MONTH, 0);
  cal.set(Calendar.DATE, 1);
  //you can set the time you need here ...
  cell.setCellValue(cal);
  cell.setCellStyle(cellStyle);

Результат:

enter image description here

Если я оставлю часть YEAR / MONTH / DATE нормальной, часы будут равны всем часам с1 января 1970 года.

0 голосов
/ 05 апреля 2018

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

для файлов .xlsx

XSSFWorkbook workbook= new XSSFWorkbook(FilePath);
XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

для файлов .xls

HSSFWorkbook workbook= new HSSFWorkbook(FilePath);
HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

Для того, чтобы положить время в Excel, я создал простой файл класса, так что вы можете очень легко просто изменить все входные данные для строк и столбцов.Это, однако, для XSSF, но это не должно быть проблемой, чтобы перейти на HSSF.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class test {

    public static void main(String [] args) {
        System.out.println(Time());
    }

    public static String Time () {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat s = new SimpleDateFormat("HH:mm:ss"); //Changeable
        return s.format(cal.getTime()).toString();
    }

    public void addtoExcel() throws IOException {
        InputStream ExcelFileToRead = new FileInputStream(file_path);
        XSSFWorkbook  wb = new XSSFWorkbook(ExcelFileToRead);
        XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
        XSSFSheet sheet = wb.getSheetAt(0);

        sheet.createRow(rowIndex).createCell(columnIndex).setCellValue(Time());

        FileOutputStream out =  new FileOutputStream(new File(file_path));                
        wb.write(out);
        out.close();
    }
}
...