簡體   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