Формула Excel по текущему значению / POI ячейки - PullRequest
0 голосов
/ 26 ноября 2018

Я работаю над приложением POI, чтобы манипулировать файлом Excel.

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

Например, для столбцов B я хочу применить ко всем моим столбцам формулу.Пользователь дает мне LEFT (x, 2), и я должен применить это ко всем столбцам.(x определяет все столбцы)

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

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

С уважением,

Код:

for (int i = 0; i < cell[0].length; i++){ //Checking the header
    for (int j = 0; j < ruleArray.length; j++){  //Checking the Header of the array with the rule to apply
        if (cell[0][i].toString().equals(ruleArray[j][0])){  //Comparing 
        String testF = ruleArray[j][1];
            if (testF.contains("X") || testF.contains("x")){ //Replacing X with value for the formula
                for (int k = 0; k < cell.length; k++){
                indexT = cell[0][i].getColumnIndex(); 
                indexC = cell[k][i].getRowIndex()+1;
                String colLetter = CellReference.convertNumToColString(indexT);

                formula = testF.replace("x", colLetter+indexC);
                cell[k][i].setCellType(CellType.FORMULA);      
                cell[k][i].setCellFormula(formula);
            }
        }
    }
}

}

1 Ответ

0 голосов
/ 26 ноября 2018

Я не переписываю ваш код, но вы можете воспользоваться помощью.Создайте файл Excel со столбцом Город и формула , а затем запустите этот код.Я приложил некоторый снимок файла Excel.Я тонкий комплект поможет вам. LEFT (X, 2) анализирует только первые два символа из строки

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestProblem

{
    public static void main(String[] args) throws IOException {


        InputStream inp = null;
        inp = new FileInputStream("E:\\Projects\\PoiAdvanceExample\\stackProblem.xlsx");

        Workbook wb = WorkbookFactory.create(inp);
        Sheet sheet = wb.getSheetAt(0);

        int rowsCount = sheet.getLastRowNum();
        int columnCount = sheet.getRow(0).getLastCellNum();
        String[][] inputData = new String[rowsCount+1][columnCount];

        for (int i = 0; i <= rowsCount; i++) {
            Row row = sheet.getRow(i);
            int colCounts = row.getLastCellNum();
            for (int j = 0; j < colCounts; j++) {
                Cell cell = row.getCell(j);
                if(cell.getCellType() == CellType.NUMERIC) {
                    inputData[i][j] = Double.toString(cell.getNumericCellValue());
                }
                if(cell.getCellType() == CellType.FORMULA) {
                    inputData[i][j] = cell.getCellFormula();
                }
                if(cell.getCellType() == CellType.STRING) {
                    inputData[i][j] = cell.getStringCellValue();
                }
            }
        }

       writeData(inputData);

    }

    private static void writeData(String[][] inputData) throws IOException {

        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet();

        int r = 0;
        for (String[] dataRow : inputData) {
            Row row = sheet.createRow(r++);
            int column = 0;
            for (String dataCell : dataRow) {
                Cell cell = row.createCell(column++);
                if (r == 1 || column == 1) cell.setCellValue(dataCell);

                else if (column == 2) {
                    CellReference cellReference = new CellReference(cell);
                    String thisR = cellReference.getCellRefParts()[1];
                    cell.setCellFormula("LEFT(A" + thisR + ",2)");
                }
            }
        }


        FileOutputStream fileOut = new FileOutputStream("stackProblem.xlsx");
        workbook.write(fileOut);
        workbook.close();
    }
}

Файл Excel перед запуском будет выглядеть следующим образом.

Excel file before run like this

Файл Excel после запуска этого кода будет выглядеть следующим образом.

Excel file after run this code

...