8
votes

Trouver une cellule fusionnée dans Excel, diviser les cellules et écrivez ceux de la nouvelle feuille de calcul?

On m'a donné une affectation que j'ai besoin de diviser les données d'une feuille de calcul et de l'écrire dans la nouvelle feuille de calcul. Les conditions sont données à la feuille de calcul peuvent avoir plusieurs nombres de cellules fusionnées et je dois trouver ces cellules fusionnées et écrire ces données dans une nouvelle feuille de calcul. C'est-à-dire que les données ou les cellules entre une cellule fusionnée jusqu'à une autre cellule fusionnée doivent être écrites dans une autre feuille de calcul.

Mon code d'effort est donné ci-dessous, P>

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
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.hssf.usermodel.HSSFWorkbook;


public class CopyTest {

public static void main(String[] args) throws IOException {
    CopyTest excel = new CopyTest();
    excel.process("D:\\B3.xls");
 }

public void process(String fileName) throws IOException {
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
    HSSFWorkbook workbook = new HSSFWorkbook(bis);
    HSSFWorkbook myWorkBook = new HSSFWorkbook();
    HSSFSheet sheet = null;
    HSSFRow row = null;
    HSSFCell cell = null;
    HSSFSheet mySheet = null;
    HSSFRow myRow = null;
    HSSFCell myCell = null;
    int sheets = workbook.getNumberOfSheets();
    int fCell = 0;
    int lCell = 0;
    int fRow = 0;
    int lRow = 0;

    for (int iSheet = 0; iSheet < sheets; iSheet++) {
        sheet = workbook.getSheetAt(iSheet);
        if (sheet != null) {
            mySheet = myWorkBook.createSheet(sheet.getSheetName());

            fRow = sheet.getFirstRowNum();
            System.out.println("First Row at"+fRow);
            lRow = sheet.getLastRowNum();
            for (int iRow = fRow; iRow <= lRow; iRow++) {
                row = sheet.getRow(iRow);
                myRow = mySheet.createRow(iRow);



                if (row != null) {
                    fCell = row.getFirstCellNum();
                    lCell = row.getLastCellNum();
                    for (int iCell = fCell; iCell < lCell; iCell++) {
                        //if (mySheet.getMergedRegionAt(index)!=null)
                       System.out.println("Finding next merged Cells");
                       cell = row.getCell(iCell);
                        myCell = myRow.createCell(iCell);
                        if (cell != null) {
                            myCell.setCellType(cell.getCellType());

                            switch (cell.getCellType()) {
                            case HSSFCell.CELL_TYPE_BLANK:
                                myCell.setCellValue("");
                                break;

                            case HSSFCell.CELL_TYPE_BOOLEAN:
                                myCell.setCellValue(cell.getBooleanCellValue());
                                break;

                            case HSSFCell.CELL_TYPE_ERROR:
                                myCell.setCellErrorValue(cell.getErrorCellValue());
                                break;

                            case HSSFCell.CELL_TYPE_FORMULA:
                                myCell.setCellFormula(cell.getCellFormula());
                                break;

                            case HSSFCell.CELL_TYPE_NUMERIC:
                                myCell.setCellValue(cell.getNumericCellValue());
                                break;

                            case HSSFCell.CELL_TYPE_STRING:
                                myCell.setCellValue(cell.getStringCellValue());
                                break;
                            default:
                                myCell.setCellFormula(cell.getCellFormula());
                               // System.out.println("Reading Cell value\t"+myCell);
                            }System.out.println("Reading Cell value\t"+myCell);
                        }
                    }
                }
            }
        }

    }  

    bis.close();
    BufferedOutputStream bos = new BufferedOutputStream(
            new FileOutputStream("D:\\Result Excel1.xls", true));
    myWorkBook.write(bos);
    bos.close();

 }}


0 commentaires

3 Réponses :


13
votes

Selon le Javadocs pour hssfsheet code> , getmergegedcellregionat () code> a été obsolète en 2008 parce que la région code> renvoie a également été obsolète, en faveur de cellrangeAdress code> . Il suggère que vous devriez utiliser getmergedregion (int ) code> à la place, qui renvoie un cellrangeAdress code>.

Les données de la région fusionnées ne sont pas stockées directement avec les cellules elles-mêmes, mais avec la feuille code> objet. Donc, vous n'avez pas besoin de boucler à travers des rangées et des cellules à la recherche de s'ils font partie d'une région fusionnée; Vous avez juste besoin de boucler dans la liste des régions fusionnées sur la feuille, puis ajoutez la région fusionnée à votre nouvelle feuille avec addMeRgegion (CellrangeAddress) code> . P>

for (int i = 0; i < sheet.getNumMergedRegions(); i++)
{
    CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
    // Just add it to the sheet on the new workbook.
    mySheet.addMergedRegion(mergedRegion);
}


1 commentaires

Bonne réponse. Juste pour faire la réponse complète: il existe également la possibilité d'utiliser getmergedregions () qui renvoie une liste de cellrangeAdress .



4
votes

Les cellules fusionnées ont leur valeur dans la première cellule.

La méthode suivante renvoie la valeur de la région fournie à la première ligne et à la colonne de la première cellule dans la région fusionnée P>

String getMergedRegionStringValue(HSSFSheet sheet, int firstRow, int firstColumn){
   for(int i = 0; i < sheet.getNumMergedRegions(); i++) {
        CellRangeAddress region = sheet.getMergedRegion(i);

        int colIndex = region.getFirstColumn();
        int rowNum = region.getFirstRow();
        //check first cell of the region
        if(rowNum == firstRow && colIndex == firstColumn){  
            return sheet.getRow(rowNum).getCell(colIndex).getStringCellValue();
        }
    }
}


0 commentaires

2
votes

RGGETTMANS La réponse est complètement correcte.

Java 8 H2>

Je voulais juste ajouter une solution pour Java 8 avec des flux: P>

Sheet oldSheet, newSheet;
IntStream.range(0, oldSheet.getNumMergedRegions())
           .mapToObj(oldSheet::getMergedRegion)
           .forEach(newSheet::addMergedRegion);


0 commentaires