繁体   English   中英

Excel VBA函数转换为Java poi

[英]Excel VBA function to Java poi

我是Java的新手,所以请多多包涵。 我知道java apache poi具有以下内置函数,但是我对如何使用它有些迷惑:

1)code_col = WorksheetFunction.Match(“ Code”,sheet.Range(“ 1:1”),0)

2)count = WorksheetFunction.CountIf(ref_sheet.Range(“ A:A”),收款人)

3)lr = sheet.Cells(1,1).CurrentRegion.Rows.count

如果您可以提供有关VBA代码如何转换为其等效的Java apache poi的示例,那将是一个很大的帮助。
因此,我基本上将VBA模块转换为Java。 我使用apache poi库。 但是,我上面的那三行代码很难转换为它的java等效代码

正如我在评论中已经说过的那样,这个问题无法得到一般性的回答。

Apache poi用于创建Microsoft Office文件。 因此, apache poi能够创建具有功能MATCHCOUNTIF Excel文件,该文件存储在单元格的公式中。 如果它可以访问这些公式中引用的所有单元格,则还可以评估这些公式。

因此,对于一个具体示例,具有如下所示的MSExcelWithVBA.xlsm

在此处输入图片说明

和这样的VBA代码:

Sub test()
 Set this_sheet = ThisWorkbook.Worksheets("Sheet1")
 code_col = WorksheetFunction.Match("Code", this_sheet.Range("1:1"), 0)
 Debug.Print "code_col: " & code_col
 payee = "b"
 payee_count = WorksheetFunction.CountIf(this_sheet.Range("A:A"), payee)
 Debug.Print "payee_count: " & payee_count
 count_rows_in_region = this_sheet.Cells(1, 1).CurrentRegion.Rows.Count
 Debug.Print "count_rows_in_region: " & count_rows_in_region
End Sub

然后,此VBA代码将打印到立即窗口:

code_col: 4
payee_count: 3
count_rows_in_region: 9

使用相同的MSExcelWithVBA.xlsm ,像这样的Java代码:

import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.formula.WorkbookEvaluator;
import org.apache.poi.ss.formula.eval.*;

public class ExcelEvaluateSomeFunctions{

 public static void main(String[] args) throws Exception {
  Workbook workbook = WorkbookFactory.create(new FileInputStream("MSExcelWithVBA.xlsm"));
  Sheet this_sheet = workbook.getSheet("Sheet1");
  CreationHelper helper = workbook.getCreationHelper();

  XSSFFormulaEvaluator formulaevaluator = (XSSFFormulaEvaluator)helper.createFormulaEvaluator();
  WorkbookEvaluator workbookevaluator = formulaevaluator._getWorkbookEvaluator();
  ValueEval valueeval = null;

  //code_col = WorksheetFunction.Match("Code", this_sheet.Range("1:1"), 0)
  double code_col = Double.NaN;
  valueeval = workbookevaluator.evaluate("MATCH(\"Code\", " + this_sheet.getSheetName() + "!1:1, 0)", null);
  if (valueeval instanceof NumberEval) {
   code_col = ((NumberEval)valueeval).getNumberValue();
  }
  System.out.println("code_col: " + code_col);

  //payee_count = WorksheetFunction.CountIf(this_sheet.Range("A:A"), payee)
  String payee = "b";
  double payee_count = Double.NaN;
  valueeval = workbookevaluator.evaluate("COUNTIF(" + this_sheet.getSheetName() + "!A:A, \"" + payee + "\")", null);
  if (valueeval instanceof NumberEval) {
   payee_count = ((NumberEval)valueeval).getNumberValue();
  }
  System.out.println("payee_count: " + payee_count);

  //count_rows_in_region = this_sheet.Cells(1, 1).CurrentRegion.Rows.Count
  //this is not possible since apache poi does not know the concept of CurrentRegion
  //best you could do:
  int count_rows_in_sheet = this_sheet.getLastRowNum()+1;
  System.out.println("count_rows_in_sheet: " + count_rows_in_sheet);

  workbook.close();
 }  
}

打印到System.out

code_col: 4.0
payee_count: 3.0
count_rows_in_sheet: 9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM