Java 在Excel中查找合并的单元格,拆分单元格并将其写入新的电子表格?
我被分配了一个任务,我需要拆分电子表格的数据并将其写入新的电子表格。条件是,给定的电子表格可能有多个合并单元格,我需要找到这些合并单元格并将这些数据写入新的电子表格。 即,从一个合并单元格到另一个合并单元格之间的数据或单元格必须写入另一个电子表格 我的工作守则如下:Java 在Excel中查找合并的单元格,拆分单元格并将其写入新的电子表格?,java,excel,apache-poi,Java,Excel,Apache Poi,我被分配了一个任务,我需要拆分电子表格的数据并将其写入新的电子表格。条件是,给定的电子表格可能有多个合并单元格,我需要找到这些合并单元格并将这些数据写入新的电子表格。 即,从一个合并单元格到另一个合并单元格之间的数据或单元格必须写入另一个电子表格 我的工作守则如下: import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java
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();
}}
import java.io.BufferedInputStream;
导入java.io.BufferedOutputStream;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入org.apache.poi.hssf.usermodel.HSSFCell;
导入org.apache.poi.hssf.usermodel.HSSFRow;
导入org.apache.poi.hssf.usermodel.HSSFSheet;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
公共类文案测试{
公共静态void main(字符串[]args)引发IOException{
CopyTest excel=新的CopyTest();
excel.process(“D:\\B3.xls”);
}
公共无效进程(字符串文件名)引发IOException{
BufferedInputStream bis=新BufferedInputStream(新文件输入流(文件名));
HSSF工作手册=新的HSSF工作手册(bis);
HSSFWorkbook myWorkBook=新建HSSFWorkbook();
HSSF工作表=空;
HSSFRow行=空;
HSSFCell单元=空;
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;
对于(int-ISHET=0;ISHETgetMergedCellRegionAt()
在2008年被弃用,因为它返回的区域也被弃用,取而代之的是CellRangeAddress
。它建议您应该改用它,它返回一个CellRangeAddress
合并区域数据不是直接与单元格一起存储的,而是与工作表
对象一起存储的。因此,您不需要在行和单元格之间循环查找它们是否是合并区域的一部分;只需在工作表上的合并区域列表中循环,然后将合并区域添加到新工作表中
for(int i=0;i
HSSFSheet
上的这些方法位于界面中,因此它们将与Apache POI支持的任何Excel工作簿一起使用,.xls(HSSF)或.xlsx(XSSF)。合并单元格的值位于第一个单元格中。
以下方法返回合并区域中第一个单元格的行和列提供的区域值
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();
}
}
}
String getMergedRegionStringValue(HSSFSheet sheet,int firstRow,int firstColumn){
对于(int i=0;i
男人的回答完全正确
爪哇8
我只是想为Java 8添加一个带有流的解决方案:
Sheet oldSheet, newSheet;
IntStream.range(0, oldSheet.getNumMergedRegions())
.mapToObj(oldSheet::getMergedRegion)
.forEach(newSheet::addMergedRegion);
回答正确。为了使答案完整:还可以使用getMergedRegions()
返回CellRangeAddress
列表。
Sheet oldSheet, newSheet;
IntStream.range(0, oldSheet.getNumMergedRegions())
.mapToObj(oldSheet::getMergedRegion)
.forEach(newSheet::addMergedRegion);