java 实现 excel sheet 拷贝到另一个Excel文件中 poi

本文介绍了一个Java程序,该程序能够从指定路径读取多个Excel文件,并将这些文件中的所有工作表复制到一个新的Excel文件中。此外,程序还保留了原始工作表中的合并单元格设置,并移除了单元格内容中的空白字符。

package com.liujicheng;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;

public class CopyExcelSheetToAnotherExcelSheet {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        String fromPath = "D:\\share\\jiemu_new\\";// excel存放路径
        String toPath = "c:\\ok\\";// 保存新EXCEL路径
        // 新的excel 文件名
        String excelName = "节目访问量";
        // 创建新的excel
        HSSFWorkbook wbCreat = new HSSFWorkbook();
        File file = new File(fromPath);
        for (File excel : file.listFiles()) {
            // 打开已有的excel
            String strExcelPath = fromPath + "\\" + excel.getName();
            InputStream in = new FileInputStream(strExcelPath);
            HSSFWorkbook wb = new HSSFWorkbook(in);
            for (int ii = 0; ii < wb.getNumberOfSheets(); ii++) {
                HSSFSheet sheet = wb.getSheetAt(ii);
                HSSFSheet sheetCreat = wbCreat.createSheet(sheet.getSheetName());
                // 复制源表中的合并单元格
                MergerRegion(sheetCreat, sheet);
                int firstRow = sheet.getFirstRowNum();
                int lastRow = sheet.getLastRowNum();
                for (int i = firstRow; i <= lastRow; i++) {
                    // 创建新建excel Sheet的行
                    HSSFRow rowCreat = sheetCreat.createRow(i);
                    // 取得源有excel Sheet的行
                    HSSFRow row = sheet.getRow(i);
                    // 单元格式样
                    int firstCell = row.getFirstCellNum();
                    int lastCell = row.getLastCellNum();
                    for (int j = firstCell; j < lastCell; j++) {
                        // 自动适应列宽 貌似不起作用
                        //sheetCreat.autoSizeColumn(j);
                        System.out.println(row.getCell(j));
                        rowCreat.createCell(j);
                        String strVal ="";
                        if (row.getCell(j)==null) {
                           
                        }else{
                             strVal = removeInternalBlank(row.getCell(j).getStringCellValue());
                        }
                        rowCreat.getCell(j).setCellValue(strVal);
                    }
                }
            }
        }
        FileOutputStream fileOut = new FileOutputStream(toPath + excelName + ".xls");
        wbCreat.write(fileOut);
        fileOut.close();
    }
 
    /**
     * 复制原有sheet的合并单元格到新创建的sheet
     *
     * @param sheetCreat
     *            新创建sheet
     * @param sheet
     *            原有的sheet
     */
    private static void MergerRegion(HSSFSheet sheetCreat, HSSFSheet sheet) {
        int sheetMergerCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergerCount; i++) {
            Region mergedRegionAt = sheet.getMergedRegionAt(i);
            sheetCreat.addMergedRegion(mergedRegionAt);
        }

    }

    /**
     * 去除字符串内部空格
     */
    public static String removeInternalBlank(String s) {
        // System.out.println("bb:" + s);
        Pattern p = Pattern.compile("\\s*|\t|\r|\n");
        Matcher m = p.matcher(s);
        char str[] = s.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length; i++) {
            if (str[i] == ' ') {
                sb.append(' ');
            } else {
                break;
            }
        }
        String after = m.replaceAll("");
        return sb.toString() + after;
    }
}

  • 大小: 12.7 KB
Java中,可以使用Apache POI库来实现一个Excel文件中的Sheet复制到一个Excel文件的操作。Apache POI一个强大的用于处理Microsoft Office文档的Java库,支持对Excel文件的读取、写入和修改等操作。 以下是一个示例代码,演示如何将一个Excel文件中的Sheet复制到一个Excel文件中: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ExcelSheetCopier { public static void copySheet(String sourceFilePath, String targetFilePath, String sheetName) throws IOException { // 打开源Excel文件 Workbook sourceWorkbook = WorkbookFactory.create(new FileInputStream(sourceFilePath)); // 打开目标Excel文件 Workbook targetWorkbook = new XSSFWorkbook(new FileInputStream(targetFilePath)); // 获取源工作簿中的指定Sheet Sheet sourceSheet = sourceWorkbook.getSheet(sheetName); if (sourceSheet == null) { throw new IllegalArgumentException("源工作簿中不存在名为 " + sheetName + " 的Sheet"); } // 在目标工作簿中创建一个新的Sheet Sheet targetSheet = targetWorkbook.createSheet(sheetName); // 复制行和单元格内容 for (Row sourceRow : sourceSheet) { Row targetRow = targetSheet.createRow(sourceRow.getRowNum()); for (Cell sourceCell : sourceRow) { Cell targetCell = targetRow.createCell(sourceCell.getColumnIndex(), sourceCell.getCellType()); // 复制单元格值 switch (sourceCell.getCellType()) { case STRING: targetCell.setCellValue(sourceCell.getStringCellValue()); break; case NUMERIC: targetCell.setCellValue(sourceCell.getNumericCellValue()); break; case BOOLEAN: targetCell.setCellValue(sourceCell.getBooleanCellValue()); break; case FORMULA: targetCell.setCellFormula(sourceCell.getCellFormula()); break; case BLANK: targetCell.setBlank(); break; default: break; } // 复制单元格样式 CellStyle newCellStyle = targetWorkbook.createCellStyle(); newCellStyle.cloneStyleFrom(sourceCell.getCellStyle()); targetCell.setCellStyle(newCellStyle); } // 复制行高 targetRow.setHeight(sourceRow.getHeight()); } // 复制合并单元格区域 for (int i = 0; i < sourceSheet.getNumMergedRegions(); i++) { CellRangeAddress region = sourceSheet.getMergedRegion(i); targetSheet.addMergedRegion(region); } // 保存目标工作簿 try (FileOutputStream fileOut = new FileOutputStream(targetFilePath)) { targetWorkbook.write(fileOut); } // 关闭资源 sourceWorkbook.close(); targetWorkbook.close(); } public static void main(String[] args) { try { // 调用复制方法 copySheet("source.xlsx", "target.xlsx", "Sheet1"); System.out.println("Sheet复制完成"); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 代码说明: 1. **WorkbookFactory.create**:用于打开源Excel文件,支持.xls和.xlsx格式。 2. **XSSFWorkbook**:用于处理.xlsx格式的目标文件。 3. **Sheet.createRow** 和 **Row.createCell**:用于创建目标Sheet中的行和单元格,并复制源Sheet中的内容。 4. **CellStyle.cloneStyleFrom**:用于复制单元格的样式,确保目标单元格的格式与源单元格一致。 5. **Sheet.addMergedRegion**:用于复制合并单元格区域,确保目标Sheet中的合并单元格与源Sheet一致。 6. **FileOutputStream**:用于将修改后的内容写回到目标文件中。 ### 注意事项: - 该代码假设源文件和目标文件均为.xlsx格式。如果需要处理.xls格式的文件,需使用`HSSFWorkbook`替代`XSSFWorkbook`。 - 在处理大型Excel文件时,应注意内存管理,避免因内存占用过高而导致性能问题。 - Apache POI库的版本应与Excel文件的格式兼容,建议使用最新版本以获得更好的支持。 通过上述代码,可以实现一个Excel文件中的Sheet复制到一个Excel文件中,并保留单元格的格式和合并单元格区域。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值