Excel VBA函数到Java poi

Excel VBA函数到Java poi

问题描述:

我是java新手,请耐心等待。我知道java apache poi具有内置的以下功能,但我对于如何使用它有点遗失:Excel VBA函数到Java poi

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

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

3)LR = sheet.Cells(1,1).CurrentRegion.Rows。计数

如果您可以提供VBA代码如何转换为其java apache poi等效的示例,那将是一个很好的帮助。
所以我基本上将VBA模块转换为java。我使用apache poi库。然而,上述3行代码难以转换为其相当于java的代码

+0

这不是一个VBA编程问题。请更新您的标签 – jsotola

+1

'Apache poi'用于创建'Microsoft Office'文件。因此,'apache poi'能够创建具有存储在单元格中的公式中的函数MATCH和COUNTIF的Excel文件。如果能够访问这些公式中引用的所有单元格,它也能够评估这些公式。但它既不能创建也不能解释'VBA'。请让你的问题更清楚地说明什么是初始状态,以及预期的结果。 –

正如我在评论中已经说过的那样,这个问题不能回答这个问题。

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

因此,对于一个具体的例子中,具有MSExcelWithVBA.xlsm这样的:

enter image description here

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