2

からにApache POIデータをインポートするために使用しています。(APACHE POIの初心者)excel filedatabase

ここでは、ユーザーがExcelシートから列を選択し、それらの列をデータベース列にマップできるようにしています。列をマッピングした後、それ以降のレコードを挿入しようとすると、次のExcelようにDatabaseなります。

  • 値が含まれる列NO blankがマップされている場合、適切なデータがデータベースに挿入されます
  • 列にBLANK値がマッピングされている場合、aExcel Cellに空白の値があると、その前の値columnが割り当てられます。

ソースコード:

FileInputStream file = new FileInputStream(new File("C:/Temp.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(file); //Get the workbook instance for XLS file
HSSFSheet sheet = workbook.getSheetAt(0);   //Get first sheet from the workbook
Iterator<Row> rowIterator = sheet.iterator(); //Iterate through each rows from first sheet
while (rowIterator.hasNext())
{
  HSSFRow hssfRow = (HSSFRow) rowIterator.next();
  Iterator<Cell> iterator = hssfRow.cellIterator();
  int current = 0, next = 1;
  while (iterator.hasNext())
  {
    HSSFCell hssfCell = (HSSFCell) iterator.next();
    current = hssfCell.getColumnIndex();
    for(int i=0;i<arrIndex.length;i++)    //arrayIndex is array of Excel cell Indexes selected by the user
    {
      if(arrIndex[i] == hssfCell.getColumnIndex())
      {
        if(current<next) 
        {
                    //System.out.println("Condition Satisfied");     
        }
        else 
        {
          System.out.println( "pstmt.setString("+next+",null);");
          pstmt.setString(next,null);
          next = next + 1;
        }
        System.out.println( "pstmt.setString("+next+","+((Object)hssfCell).toString()+");");
        pstmt.setString(next,((Object)hssfCell).toString());
        next = next + 1;
      }
    }
  }
  pstmt.addBatch();
  }

私はSOについて同様の質問を探しましたが、それでも問題を解決することはできません。

前もって感謝します..

4

1 に答える 1

6

過去の StackOverflow の質問のかなり多くでカバーされている、非常によくある間違いを犯しました。

セルの反復に関するApache POIのドキュメントにあるように

場合によっては、反復時に、欠落したセルや空白のセルの処理方法を完全に制御する必要があり、ファイルで定義されているセルだけでなく、すべてのセルに確実にアクセスする必要があります。(CellIterator は、ファイルで定義されたセルのみを返します。これは主に値またはスタイルを持つものですが、Excel に依存します)。

ギャップを気にせずに利用可能なすべてのセルを取得するだけでなく、すべての行/セルをヒットすることに注意する必要がある状況にあるようです。

POI docs の例のようにコードを変更する必要があります。

// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());

for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
   Row r = sheet.getRow(rowNum);

   int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);

   for (int cn = 0; cn < lastColumn; cn++) {
      Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
      if (c == null) {
         // The spreadsheet is empty in this cell
         // Mark it as blank in the database if needed
      } else {
         // Do something useful with the cell's contents
      }
   }
}
于 2013-02-22T14:19:00.300 に答える