在Excel中查找合并单元格,拆分单元格并将其写入新电子表格中?

时间:2013-08-30 09:27:39

标签: java excel apache-poi

我已经获得了一个分配,我需要拆分电子表格的数据并将其写入新的电子表格。条件是,给定电子表格可能有多个合并单元格数,我需要找到那些合并单元格并在新的SpreadSheet中写入这些数据。 即,必须在另一个电子表格中写入一个合并单元格到另一个合并单元格之间的数据或单元格。

我的努力准则如下:

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();

 }}

使用此代码,我已实现将电子表格克隆到另一个新工作表中。在这里,我没有找到合并的Cell,getMergedCellRegionAt()帮助我并像A:4 D:12一样返回合并的单元格区域。我该如何处理。请帮助我,您的小小的努力表示赞赏。提前致谢。

3 个答案:

答案 0 :(得分:13)

根据Javadocs for HSSFSheetgetMergedCellRegionAt()在2008年已弃用,因为它返回的Region也已弃用,有利于CellRangeAddress。它建议您改为使用getMergedRegion(int),它会返回CellRangeAddress

合并的区域数据不直接与单元格本身一起存储,而是与Sheet对象一起存储。因此,您不需要遍历行和单元格来查找它们是否是合并区域的一部分;您只需要遍历工作表上的合并区域列表,然后使用addMergedRegion(CellRangeAddress)将合并的区域添加到新工作表中。

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);
}

HSSFSheet上的这些方法位于Sheet界面中,因此它们可以与Apache POI支持的任何Excel工作簿一起使用,.xls(HSSF)或.xlsx(XSSF)。

答案 1 :(得分:3)

合并的单元格在第一个单元格中具有值。

以下方法返回合并区域中第一个单元格的行和列提供的区域值

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();
        }
    }
}

答案 2 :(得分:1)

rgettmans的回答是完全正确的。

Java 8

我只想添加一个带有流的Java 8解决方案:

$(document).ready(function () {
    'use strict';
    $('#trialForm').hide();

    $('#trialClick').click(function () {
        $(this).slideToggle(300);
        $('#trialForm').slideToggle(300);
    });

    $('#trialForm').click(function () {
        $(this).slideToggle(300);
        $('#trialClick').slideToggle(300);
    });

    $('.clickHere form input').click(false);
});