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(); }}
3 Réponses :
Selon le Javadocs pour 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 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>.
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);
}
Bonne réponse. Juste pour faire la réponse complète: il existe également la possibilité d'utiliser getmergedregions () code> qui renvoie une liste de
cellrangeAdress code>.
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(); } } }
RGGETTMANS La réponse est complètement correcte.
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);