2016-05-24 4 views
0

Ich schreibe ein Programm in POI, um Zellen zusammenzuführen, und ich bin in der Lage, sie zusammenzuführen. Es gibt eine Spalte mit Zahleninhalt, und wenn ich diese Spalte zusammenfasse und wenn ich mein Blatt öffne und diese Spalte zu meiner Überraschung auswähle, zeigt das die Zählung und Summe an, als ob es nicht zusammengeführt wäre.Verwirrung mit der Zusammenführung mit POI

Unten ist mein Excel.

enter image description here

Hier sollte die count5 sein und sum530 sein sollte, aber dies zeigt dies als 25 und 2650

Unten ist mein Code.

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) 
    public static void main(String[] args) throws IOException { 
     FileInputStream fin = new FileInputStream(
       new File("C:\\D\\Sheets\\Quality Sheet\\Quality_template.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; 

     System.out.println(row); 
     for (int i = 2; i < row; i++) { 
      currentAssociate = sheet.getRow(i).getCell(1).toString(); 
      currentLawName = sheet.getRow(i).getCell(3).toString(); 
      currentCountry = sheet.getRow(i).getCell(4).toString(); 
      currentPages = sheet.getRow(i).getCell(5).toString(); 

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

      if (currentAssociate.equals(previousAssociate) && currentCountry.equals(previousCountry) 
        && currentLawName.equals(previousLawName) && currentPages.equals(previousPages)) { 
       finalIndex += 1; 
       if (((i + 1) == row)) { 
        System.out.println("yes"); 
        finalIndex += 1; 
        sendRangeToMergeCells(startIndex + 1, finalIndex - 1, sheet, workbook); 
       } 
      } else { 
       sendRangeToMergeCells(startIndex + 1, finalIndex, sheet, workbook); 
       startIndex = i; 
       finalIndex = 0; 
      } 

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

    private static void sendRangeToMergeCells(int startIndex, int finalIndex, HSSFSheet sheet, HSSFWorkbook workbook) { 
     System.out.println(startIndex + "\t" + (startIndex + finalIndex)); 

     CellRangeAddress region = CellRangeAddress.valueOf("F" + (startIndex) + ":F" + ((startIndex + finalIndex))); 

     sheet.addMergedRegion(region); 

    } 

} 

Das ist ziemlich verwirrend. Bitte lass mich wissen, wo ich falsch liege und wie ich das beheben kann.

Dank

+1

Dies kann ein Fehler sein. Excel behält nur den Wert in der oberen linken Zelle einer zusammengeführten Region bei. Es scheint, dass POI alle Werte beibehalten kann. Bitte dieses Problem unter https://bz.apache.org/bugzilla/buglist.cgi?list_id=146416&product=POI. Fügen Sie den Mindestcode ein, der zur Reproduktion des Problems erforderlich ist. – jmarkmurphy

Antwort

1

Dies kann das Ergebnis eines Fehlers, aber eine Behelfslösung die Zeilen nach oben statt Zusammenführung, sie verschieben kann.

public class RowsMerge { 

// public static void main(String[] args) 
public static void main(String[] args) throws IOException { 
    FileInputStream fin = new FileInputStream(
      new File("C:\\D\\Sheets\\Quality Sheet\\Quality_template.xls")); 
    HSSFWorkbook workbook = new HSSFWorkbook(fin); 
    HSSFSheet sheet = workbook.getSheetAt(0); 

    int lastRow = sheet.getLastRowNum(); 
    String currentLawName, currentCountry, currentAssociate, previousLawName, previousCountry, previousAssociate; 
    String currentPages, previousPages; 
    int rowCount = 0; 

    System.out.println(row); 
    for (int i = 2; i <= lastRow; i++) { 
     currentAssociate = sheet.getRow(i).getCell(1).toString(); 
     currentLawName = sheet.getRow(i).getCell(3).toString(); 
     currentCountry = sheet.getRow(i).getCell(4).toString(); 
     currentPages = sheet.getRow(i).getCell(5).toString(); 

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

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

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

private void shiftRowsUp(Sheet sheet, int startRow, int rowCount) { 
    if (rowCount > 0) { 
     int lastRow = sheet.getLastRowNum(); 
     if (lastRow - startRow < rowCount) { 
      for (int i = startRow - rowCount; i < startRow: i++) { 
       sheet.removeRow(sheet.getRow(i)); 
      } 
     } 
     sheet.shiftRows(startRow, lastRow, -rowCount); 
    } 
} 

} 

Hinweis: Bei dieser Schleifenbildung wird davon ausgegangen, dass in den Zeilen der Tabelle keine Lücken vorhanden sind.

Verwandte Themen