0

スプレッドシートで「期間の売上レポート」というテキストのセルを見つけようとしていますが、セルにはさらに多くのテキストがありますが、 「期間の売上レポート」は変更されない部分であり、見つけることができます。すべてのスプレッドシートの特定のセル。

そのセルの値を読み取ろうとすると、nullが発生します。

これはクラスのコードです:

package excelreader;

import javax.swing.JOptionPane;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.usermodel.Cell;

/**
 *
 * @author LuisLaptop
 */
public class FileInfo {

    // attributes

    private String date;
    private String fileName;
    private String reportCreator;
    private String sheetName;


    // constructor

    public FileInfo(HSSFSheet sheet) {


    }


    // Methods

    public String getSalesPeriod(HSSFSheet sheet) {

        String period = "Sales report for the period";

        HSSFRow row = sheet.getRow(2);
        HSSFCell cell = row.getCell(0);

        if(cell.getCellType() == Cell.CELL_TYPE_STRING)
        {
            if(cell.getStringCellValue().toString().trim().equals(period))
            {
                date = cell.getStringCellValue().toString().trim();
                return date;
            }

        }
        else
        {
            JOptionPane.showMessageDialog(null, "The report has no period", "Period Error", JOptionPane.ERROR_MESSAGE);
        }

        return date;            
    }



    // Getters and setters 

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getReportCreator() {
        return reportCreator;
    }

    public void setReportCreator(String reportCreator) {
        this.reportCreator = reportCreator;
    }

    public String getSheetName() {
        return sheetName;
    }

    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }



}

これがメインです:

package excelreader;

import java.io.FileInputStream;
import java.io.IOException;
import javax.swing.JOptionPane;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * @author lv10
 */
public class ExcelReader {
    public static void main(String[] args) throws IOException {

        FileManager fm = new FileManager();
        FileInputStream inputFile = new FileInputStream(fm.fileChooser.getSelectedFile());

        HSSFWorkbook wb = new HSSFWorkbook(inputFile);
        HSSFSheet sheet = wb.getSheetAt(0);

        Total t = new Total(sheet);
        FileInfo fi = new FileInfo(sheet);

        String report = "This is a test report"+ t.getTotal() + " from " + fi.getSalesPeriod(sheet) ;

        JOptionPane.showMessageDialog(null, report, "test", JOptionPane.INFORMATION_MESSAGE);

    }
}

これは、他の値を提供するクラス全体です。このクラスでは問題はありませんが、コンテキストを提供するために追加しました。

package excelreader;

import java.text.DecimalFormat;
import javax.swing.JOptionPane;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

/**
 * @author lv10
 */
class Total {

    // -------------------------------------------------------------- Attributes

    String cellContent[] = {"Total US", "Total DE (EUR)", "Total IT (EUR)"};
    private int rownr = 0;
    private int colnr = 0;
    private double total = 0;
    private double sum = 0;

    // ------------------------------------------------------------- Constructor


    public Total(HSSFSheet sheet)
    {
        for( int i=0; i<cellContent.length; i++)
        {
            total = findTotal(sheet, cellContent[i]);
            sum+= total;

        }
    }



    // ----------------------------------------------------------------- Methods 

    public double findTotal(HSSFSheet sheet, String cellContent){

            for(Row rows : sheet){
            for(Cell cell: rows){

                if(cell.getCellType()== Cell.CELL_TYPE_STRING){
                    if(cell.getStringCellValue().toString().trim().equals(cellContent)){
                        rownr = rows.getRowNum();

                        HSSFRow row = sheet.getRow(rownr);
                        colnr = row.getLastCellNum()-1;
                        cell = row.getCell(colnr);

                        return cell.getNumericCellValue();  
                    }
                }
            } // end of cell loop
        } // end of row loop

         return 0;

        }




    // getters and setters

    public double getSum() {
        return sum;
    }

    public void setSum(double sum) {
        this.sum = sum;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }



}
4

2 に答える 2

1

これ:

cell.getStringCellValue().toString().trim().equals(period)

セルの内容がに等しい場合period、つまり正確にである場合はtrueを返します"Sales report for the period"

しかし、あなたがあなた自身を言うように、それは「決して変わらないその一部です」。内容全体ではありません。

indexOf代わりにメソッドを使用してみてください。このメソッドは、その部分文字列の位置を返すか-1、存在しない場合に返します。

于 2012-05-20T18:35:58.133 に答える
1

contains()を使用して問題を解決しました

if(cell.getStringCellValue().toString().trim().contains(period)) 
{ 
     date = cell.getStringCellValue().toString().trim(); return date; 
} 
于 2012-05-21T16:06:08.350 に答える