有没有办法在Java中相对地将excel公式设置为整个列?
例如,在Excel中,列A和B包含数字,列C包含加法公式A + B
我想对整个C列重复相同的公式,如C1 = A1 + B1,C2 = A2 + B2。
目前我正在通过一些脏行逻辑执行此操作,该逻辑将行数替换为Number(1,2 ..so on)。但在实际情况下,公式非常庞大且复杂,难以用上述策略取代。
Apache POI是否提供了复制此类公式的任何内容,就像在Excel中一样?
答案 0 :(得分:3)
Excel的最佳实践方法是针对此问题使用R1C1
引用。通过此引用,我们可以将=SUM(RC1:RC2)
应用于范围C2:C10
。 R
表示此行,C1
表示第1列(A
),C2
表示第2列(B
)。
不幸的是,apache poi不支持R1C1
引用。所以我能看到的唯一方法就是使用CellReference
。 CellReference
可以将CellRefParts作为单元格引用的三个部分,工作表名称(如果没有提供则为null),基于1的行号和基于A的列字母。所以我们可以在公式中使用这些部分。
示例:
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import java.io.*;
class UsingCellReferenceInFormula {
public static void main(String[] args) throws IOException{
String[][] data = new String[][]{
{"Number1","Number2","Sum","Complex"},
{"123","456", null, null},
{"23.45","67.89", null, null},
{"123","-456", null, null},
{"-123.456","456.78", null, null}
};
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
int r = 0;
for(String[] dataRow : data){
Row row = sheet.createRow(r++);
int c = 0;
for(String dataCell : dataRow){
Cell cell = row.createCell(c++);
if ( r == 1 ) cell.setCellValue(dataCell);
else if ( c < 3 ) cell.setCellValue(Double.parseDouble(dataCell));
else if ( c == 3 ) {
CellReference cellReference = new CellReference(cell);
String thisR = cellReference.getCellRefParts()[1];
cell.setCellFormula("SUM(A" + thisR + ":B" + thisR + ")");
} else if ( c == 4 ) {
CellReference cellReference = new CellReference(cell);
String thisR = cellReference.getCellRefParts()[1];
cell.setCellFormula("IF(AND(A" + thisR + ">0,B" + thisR + ">0),SUM(A" + thisR + ":B" + thisR + "),MAX(A" + thisR + ":B" + thisR + "))");
}
}
}
FileOutputStream fileOut = new FileOutputStream("UsingCellReferenceInFormula.xlsx");
workbook.write(fileOut);
workbook.close();
}
}
答案 1 :(得分:0)
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import java.io.*;
class UsingCellReferenceInFormula {
public static void main(String[] args) throws IOException{
String[][] data = new String[][]{
{"Number1","Number2","Sum","Complex"},
{"123","456", null, null},
{"23.45","67.89", null, null},
{"123","-456", null, null},
{"-123.456","456.78", null, null}
};
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
int r = 0;
for(String[] dataRow : data){
Row row = sheet.createRow(r++);
int c = 0;
for(String dataCell : dataRow){
Cell cell = row.createCell(c++);
if ( r == 1 ) cell.setCellValue(dataCell);
else if ( c < 3 ) cell.setCellValue(Double.parseDouble(dataCell));
else if ( c == 3 ) {
CellReference cellReference = new CellReference(cell);
String thisR = cellReference.getCellRefParts()[1];
cell.setCellFormula("SUM(A" + thisR + ":B" + thisR + ")");
} else if ( c == 4 ) {
CellReference cellReference = new CellReference(cell);
String thisR = cellReference.getCellRefParts()[1];
cell.setCellFormula("IF(AND(A" + thisR + ">0,B" + thisR + ">0),SUM(A" + thisR + ":B" + thisR + "),MAX(A" + thisR + ":B" + thisR + "))");
}
}
}
FileOutputStream fileOut = new FileOutputStream("UsingCellReferenceInFormula.xlsx");
workbook.write(fileOut);
workbook.close();
}
}