2016-05-24 14 views
0

Excelシートで行をマージする必要があるプログラムを作成しています。現在、私は開始行をマージすることができますが、最後に来ると、どこが間違っているのか分かりません。以下は私のコードです。以下はPOIの行をマージする方法がわかりません

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.util.CellRangeAddress; 

public class RowsMerge { 

    public static void main(String[] args) throws IOException { 
     FileInputStream fin = new FileInputStream(
       new File("C:\\D\\Sheets\\Sample Sheets\\dummy.xls")); 
     HSSFWorkbook workbook = new HSSFWorkbook(fin); 
     HSSFSheet sheet = workbook.getSheetAt(0); 
     int row = sheet.getPhysicalNumberOfRows(); 
     String currentLawName, currentCountry, currentAssociate, previousLawName, previousCountry, previousAssociate; 
     String currentPages, previousPages; 
     int startIndex = 1, finalIndex = 0, tempNum = 0; 
     System.out.println(row); 
     for (int i = 2; i < (row - 1); i++) { 
      currentAssociate = sheet.getRow(i).getCell(0).toString(); 
      currentLawName = sheet.getRow(i).getCell(1).toString(); 
      currentCountry = sheet.getRow(i).getCell(2).toString(); 
      currentPages = sheet.getRow(i).getCell(3).toString(); 

      previousAssociate = sheet.getRow(i - 1).getCell(0).toString(); 
      previousLawName = sheet.getRow(i - 1).getCell(1).toString(); 
      previousCountry = sheet.getRow(i - 1).getCell(2).toString(); 
      previousPages = sheet.getRow(i - 1).getCell(3).toString(); 

      if (currentAssociate.equals(previousAssociate) && currentCountry.equals(previousCountry) 
        && currentLawName.equals(previousLawName) && currentPages.equals(previousPages)) { 
       finalIndex += 1; 
      } else { 
       sendRangeToMergeCells(startIndex, finalIndex, sheet); 
       startIndex = i; 
       finalIndex = 0; 

      } 

     } 
     FileOutputStream fileOut = new FileOutputStream("C:\\D\\Sheets\\Sample Sheets\\dummy.xls"); 
     workbook.write(fileOut); 
     fileOut.close(); 
    } 

    private static void sendRangeToMergeCells(int startIndex, int finalIndex, HSSFSheet sheet) { 
     System.out.println(startIndex + "\t" + (startIndex + finalIndex)); 
     CellRangeAddress region = CellRangeAddress 
       .valueOf("D" + (startIndex + 1) + ":D" + ((startIndex + finalIndex) + 1)); 
     sheet.addMergedRegion(region); 
    } 

} 

私のExcelシートは

SourceExcelです:

enter image description here

現在のO/P: enter image description here

期待ed o/p: enter image description here

私はどこが間違っているのか、どうすればこの問題を解決できるか教えてください。

+0

あなたはi行目の代わりにi行目のforループを終了しているので、それはありません。 – Leo

+0

こんにちは@Leo結果は同じです – Rakesh

+0

forループではなくfinalIndexをiに設定する必要はありませんか? – Leo

答えて

3

実際には、マージロジックは問題ありません。ビットが不足しているのはブレークロジック(行をマージするタイミングを決定するロジック)です。

スプレッドシートの最後の行が前の行と一致する場合は、実行が最初のブランチのif (currentAssociate.equals(previousAssociate) && ...に続き、ループが終了するため、マージは実行されません。 forループが完了した後、必要に応じて最後にマージロジックをテストして実行する必要があります。

はあなたforループの後に以下を追加します。

if (finalIndex > 0) { 
    sendRangeToMergeCells(startIndex, finalIndex, sheet); 
} 

必要であれば、これが最後の行をマージします。

関連する問題