

Javaでのプログラム作成中にExcelの関数 `_xlfn.T.INV.2T(B2,C2)` を使いたいと思い、Apache
Poiで関数を作ってそれをExcel上で表示できるところまではいきました。

そこで、画像のD2の部分の値をdoubleでjavaの変数に入れたいのですが、やり方がわからないです。調べ方が悪いだけかもですが、どのようなサイトに行ってもうまくいきません。  
（おすすめのサイトとかあれば教えていただけると助かります。）

以下はExcelファイルを作るところまでのコードです。

それとExcelは関数が使用しただけだったので、お時間あればそのExcelのファイルを毎回自動で消せるようなプログラムもあれば教えてほしいです。  
お願いします。

[![この写真のD2部分が欲しいです](https://i.stack.imgur.com/QYtoP.png)](https://i.stack.imgur.com/QYtoP.png)

[code]

    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import java.io.*;
    import java.util.Scanner;
    
    public class Main
    {
        public static void Welch_test ()
        {
            System.out.println ("Test population mean in two different populations are same or not");
            System.out.println ("This program works only for two-tailed ");
    
            Scanner in = new Scanner(System.in);
            System.out.println ("Do you want population with same variation(Type 1) or different variation(Type 2):");
            int type = in.nextInt();
    
            System.out.println ("How many samples did you take from first population:");
            double na = in.nextDouble();
    
            System.out.println ("How many samples did you take from second population:");
            double nb = in.nextDouble();
    
            System.out.println ("What is your Sample mean for first population:");
            double Xa = in.nextDouble();
    
            System.out.println ("What is your Sample mean for second population:");
            double Xb = in.nextDouble();
    
            System.out.println ("What is unbiased variance for first population:");
            double Ua = in.nextDouble();
    
            System.out.println ("What is unbiased variance for second population:");
            double Ub = in.nextDouble();
    
            System.out.println ("What is Level of Significance (Type with %-value)");
            double L = in.nextDouble();
            double l = L/100;
            System.out.println ("A p value " + l + " was considered statistically significant.");
    
            if (type == 1)
            {
                double k = na+nb-2;
                double p = Math.abs(Xa-Xb);
                double one = ((1/na)+(1/nb));
                double two = ((((Ua)*(na-1))+((Ub)*(nb-1)))/(na+nb-2));
                double three = one*two;
                double q = Math.sqrt(three);
                double T = p/q;
                System.out.println ("Degree of freedom is " + k);
                System.out.println ("Test statistic is " + T);
    
                Workbook wb = new XSSFWorkbook();
                Sheet sheet = wb.createSheet();
                Row row1 = sheet.createRow(1);
    
                Cell cell1_1 = row1.createCell(1);
                Cell cell1_2 = row1.createCell(2);
                Cell cell1_3 = row1.createCell(3);
    
                cell1_1.setCellValue(l);
                cell1_2.setCellValue(k);
                cell1_3.setCellFormula("_xlfn.T.INV.2T(B2,C2)");
    
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream("T-inverse.xlsx");
                    wb.write(out);
                } catch(IOException e) {
                    System.out.println(e.toString());
                } finally {
                    try {
                        out.close();
                    } catch(IOException e) {
                        System.out.println(e.toString());
                    }
                }
            }
            else
            {
                double x = Math.abs(Xa-Xb);
                double y = Math.sqrt((Ua/na)+(Ub/nb));
                double z = x/y;
                double parta = Math.pow(((Ua/na)+(Ub/nb)), 2);
                double partm = Math.pow((Ua/na), 2);
                double partn = Math.pow((Ub/nb), 2);
                double partb = (partm/(na-1));
                double partc = (partn/(nb-1));
                double partd = partb+partc;
                double j = parta/partd;
                j = Math.round(j);
                System.out.println ("Degree of Freedom is " + j);
                System.out.println ("Test statistic is " + z);
    
                Workbook wb = new XSSFWorkbook();
                Sheet sheet = wb.createSheet();
                Row row1 = sheet.createRow(1);
    
                Cell cell1_1 = row1.createCell(1);
                Cell cell1_2 = row1.createCell(2);
                Cell cell1_3 = row1.createCell(3);
    
                cell1_1.setCellValue(l);
                cell1_2.setCellValue(j);
                cell1_3.setCellFormula("_xlfn.T.INV.2T(B2,C2)");
    
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream("T-inverse.xlsx");
                    wb.write(out);
                } catch(IOException e) {
                    System.out.println(e.toString());
                } finally {
                    try {
                        out.close();
                    } catch(IOException e) {
                        System.out.println(e.toString());
                    }
                }
            }
        }
        public static void main(String[] args)
        {
            Welch_test();
        }
    }
    
[/code]


CC BY-SA 4.0
2020-02-18T10:55:19.937
63152
2020-02-23T10:46:54.480
2020-02-19T06:28:59.117
3060
36217
question
java excel apache-poi
apache poi を使って、Excel のセルの値を読み込む


セルの計算結果を取得するだけでしたら、getNumericCellValueで取得できるはずです。

[code]

    double result = cell1_3.getNumericCellValue（）;
    
[/code]

ただし、[T.INV.2T 関数のリファレンス](https://support.office.com/ja-
jp/article/t-inv-2t-%E9%96%A2%E6%95%B0-ce72ea19-ec6c-4be7-bed2-b9baf2264f17)を見ると、エラー値である#VALUE!
や#NUM! も返る可能性がありますので、それを考慮したコーディングにする必要があるかもしれません。

このあたりを厳密にやるとするとFormulaEvaluatorというインターフェースを使って、CellオブジェクトからCellValueを取得して、セルのタイプごとに処理を分岐する、というようなことをやる必要があるみたいです（実際に私はそこまで組んだことがないため、これ以上はっきりとは言えませんので、そこまで必要かどうかは質問者さんのご判断にお任せします）。


CC BY-SA 4.0
2020-02-23T10:46:54.480
63299
2020-02-23T10:46:54.480
9515
63152
answer