`
junier
  • 浏览: 76339 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

[转]使用POI操作Excel:Sheet拷贝

    博客分类:
  • J2EE
 
阅读更多
项目中很多模块需要将数据导出到Excel中,简单的如导出所有的用户信息到Excel,对于导出这种数据,可以通过POI/JXL直接生成Excel即可;当面临复杂格式的报表怎么办呢?下面这张图是项目中某张需要导出的Excel模版中部分截图,需求是根据查询条件生成N张同类型的这种单子到Excel中的不同Sheet中,后期要打印成纸质单据!需要明确有几个重点是:需要在A4纸中打印,所有打印出来的格式必须一样,可能后期这张表还会进行调整,必须满足其高扩展和变化性;

事实上我们依然可以通过程序将Excel写出来,事实上开始我确实也是这么做了,但是在做的过程中发现,要手写代码生成这种几十行的Excel实在是一个很大的工作量,尤其是对样式的控制更是繁琐;而且用程序生拼单元格生成Sheet不能正常打印到A4纸中,最后果断放弃,事实证明这个选择是正确的!

好吧,说了这么多总算进入正题,最后我选择了通过程序Copy整个Sheet的方式,采用通过这种实现方式,我只需要相关人员给我提供设置好模版,在批量生成的时候先通过Copy的方式生成新的Sheet,然后在向指定的Sheet中填写相关数据即可,而且当模版发生变化时只需调整Sheet中写值的代码即可!

重点是两个方法:copySheet和copyRow,主要代码如下:
    package org.pihai.utils.excel.poi;  
     
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import org.apache.poi.hssf.usermodel.HSSFCell;  
    import org.apache.poi.hssf.usermodel.HSSFPrintSetup;  
    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;  
     
    /**  
    * POI操作Excel  
    * @since: 1.0  
    * @version:1.0  
    * @createTime:2011年05月21日 16:12:15  
    * @updateTime:2011年07月21日 10:47:20  
    * @author niejy  niejingyu@gmail.com  
    */ 
    public class PoiExcelSheetCopy {  
          
        /**  
         * 根据源Sheet样式copy新Sheet  
         * @param fromsheetname  
         * @param newsheetname  
         * @param targetFile  
         */ 
        public void copySheet(String fromsheetname, String newsheetname,String targetFile) {  
            HSSFWorkbook wb = null;  
            try {  
                FileInputStream fis = new FileInputStream(targetFile);  
                wb = new HSSFWorkbook(fis);  
                HSSFSheet fromsheet = wb.getSheet(fromsheetname);  
                if (fromsheet != null && wb.getSheet(newsheetname) == null) {  
                    HSSFSheet newsheet = wb.createSheet(newsheetname);  
                    //设置打印参数  
                    newsheet.setMargin(HSSFSheet.TopMargin,fromsheet.getMargin(HSSFSheet.TopMargin));// 页边距(上)  
                    newsheet.setMargin(HSSFSheet.BottomMargin,fromsheet.getMargin(HSSFSheet.BottomMargin));// 页边距(下)  
                    newsheet.setMargin(HSSFSheet.LeftMargin,fromsheet.getMargin(HSSFSheet.LeftMargin) );// 页边距(左)  
                    newsheet.setMargin(HSSFSheet.RightMargin,fromsheet.getMargin(HSSFSheet.RightMargin));// 页边距(右  
                      
                    HSSFPrintSetup ps = newsheet.getPrintSetup();  
                    ps.setLandscape(false); // 打印方向,true:横向,false:纵向(默认)  
                    ps.setVResolution((short)600);  
                    ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //纸张类型  
                      
                    File file = new File(targetFile);  
                    if (file.exists() && (file.renameTo(file))) {  
                        copyRows(wb, fromsheet, newsheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum());  
                        FileOutputStream fileOut = new FileOutputStream(targetFile);  
                        wb.write(fileOut);  
                        fileOut.flush();  
                        fileOut.close();  
                    } else {  
                        System.out.println(“文件不存在或者正在使用,请确认…”);  
                    }  
                }  
                fis.close();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
          
        /**  
         * 拷贝Excel行  
         * @param wb  
         * @param fromsheet  
         * @param newsheet  
         * @param firstrow  
         * @param lastrow  
         */ 
        public void copyRows(HSSFWorkbook wb, HSSFSheet fromsheet,HSSFSheet newsheet, int firstrow, int lastrow) {  
            if ((firstrow == -1) || (lastrow == -1) || lastrow < firstrow) {  
                return;  
            }  
            // 拷贝合并的单元格  
            Region region = null;  
            for (int i = 0; i < fromsheet.getNumMergedRegions(); i++) {  
                region = fromsheet.getMergedRegionAt(i);  
                if ((region.getRowFrom() >= firstrow)&& (region.getRowTo() <= lastrow)) {  
                    newsheet.addMergedRegion(region);  
                }  
            }  
     
            HSSFRow fromRow = null;  
            HSSFRow newRow = null;  
            HSSFCell newCell = null;  
            HSSFCell fromCell = null;  
            // 设置列宽  
            for (int i = firstrow; i <= lastrow; i++) {  
                fromRow = fromsheet.getRow(i);  
                if (fromRow != null) {  
                    for (int j = fromRow.getLastCellNum(); j >= fromRow.getFirstCellNum(); j–) {  
                        int colnum = fromsheet.getColumnWidth((short) j);  
                        if (colnum > 100) {  
                            newsheet.setColumnWidth((short) j, (short) colnum);  
                        }  
                        if (colnum == 0) {  
                            newsheet.setColumnHidden((short) j, true);  
                        } else {  
                            newsheet.setColumnHidden((short) j, false);  
                        }  
                    }  
                    break;  
                }  
            }  
            // 拷贝行并填充数据  
            for (int i = 0; i <= lastrow; i++) {  
                fromRow = fromsheet.getRow(i);  
                if (fromRow == null) {  
                    continue;  
                }  
                newRow = newsheet.createRow(i – firstrow);  
                newRow.setHeight(fromRow.getHeight());  
                for (int j = fromRow.getFirstCellNum(); j < fromRow.getPhysicalNumberOfCells(); j++) {  
                    fromCell = fromRow.getCell((short) j);  
                    if (fromCell == null) {  
                        continue;  
                    }  
                    newCell = newRow.createCell((short) j);  
                    newCell.setCellStyle(fromCell.getCellStyle());  
                    int cType = fromCell.getCellType();  
                    newCell.setCellType(cType);  
                    switch (cType) {  
                    case HSSFCell.CELL_TYPE_STRING:  
                        newCell.setCellValue(fromCell.getRichStringCellValue());  
                        break;  
                    case HSSFCell.CELL_TYPE_NUMERIC:  
                        newCell.setCellValue(fromCell.getNumericCellValue());  
                        break;  
                    case HSSFCell.CELL_TYPE_FORMULA:  
                        newCell.setCellFormula(fromCell.getCellFormula());  
                        break;  
                    case HSSFCell.CELL_TYPE_BOOLEAN:  
                        newCell.setCellValue(fromCell.getBooleanCellValue());  
                        break;  
                    case HSSFCell.CELL_TYPE_ERROR:  
                        newCell.setCellValue(fromCell.getErrorCellValue());  
                        break;  
                    default:  
                        newCell.setCellValue(fromCell.getRichStringCellValue());  
                        break;  
                    }  
                }  
            }  
        }  
          
        public static void main(String[] args) {  
            PoiExcelSheetCopy ew = new PoiExcelSheetCopy();  
            ew.copySheet(“template”, “test2″, “d:/template.xls”);  
        }  
    }  

转自:http://www.pihai.me/archives/882.html#header
分享到:
评论
3 楼 njyu 2013-01-12  
iridiumcao 写道
谢谢 njyu 文末的批注,让我少走了弯路。。。

客气,只是当初自己也走过弯路而已!
2 楼 iridiumcao 2013-01-11  
谢谢 njyu 文末的批注,让我少走了弯路。。。
1 楼 njyu 2012-01-17  
哥们,最近发现这篇有点小问题,复制SHEET直接使用POI API中提供的方法即可!详见最新文章!谢谢!http://www.pihai.me/archives/987.html

相关推荐

    Java poi复制execl的sheet页,跨文件操作,数据和样式全部复制,工具类

    本篇将详细讲解如何使用POI库进行Excel的Sheet页复制,包括数据和样式的跨文件操作。 首先,我们需要在项目中引入Apache POI的依赖。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

    poi实现sheet页复制和根据空行拆分

    4. 复制数据:使用CellCopyPolicy或直接遍历源Sheet的所有行和列,将数据及样式复制到新Sheet。注意,样式包括字体、填充、边框等。 5. 保存Workbook:最后,使用Workbook的write方法将更改写入到Excel文件。 二、...

    poi、easyexcel分别完美复制excel的Sheet

    不要再使用从copysheet、copyrow、copyStyle的方式复制sheet页了。明明可以几行代码搞定的事情。。在easyexcel-test模块下WriteTest类中。1、readAndWriteSheetPOI。2、readAndWriteSheet 这两个方法中。

    poi复制指定行数的Excel表格内容

    2. **打开Excel文件**:使用`XSSFWorkbook`类读取.xlsx文件,`HSSFWorkbook`类读取.xls文件。然后,通过`Sheet`对象获取工作表。 3. **复制指定行**:遍历需要复制的行号,使用`Row`对象的`copyRowTo()`方法复制...

    java的POI操作Excel文件.pdf

    本文将深入探讨使用POI进行Excel操作时的一些关键知识点,以及如何解决遇到的问题。 首先,我们来看一个常见的问题:设置分页符的bug。在POI的HSSFSheet类中,`setRowBreak`方法用于设置工作表的分页符。然而,当...

    java的POI操作Excel文件2.pdf

    本文将深入探讨在使用POI进行Excel操作时遇到的一些常见问题及解决方案,特别是关于设置分页符的bug和如何复制行。 1. 设置分页符的bug: 在POI的HSSFSheet类中,setRowBreak方法用于设定工作表的分页符。然而,...

    JAVA对Excel的基本操作(包括创建,更新,读取,拷贝等相关操作)

    本篇文章将深入探讨如何使用Java进行Excel的基本操作,包括创建、更新、读取和拷贝等。 首先,Java中处理Excel文件最常用的库是Apache POI。Apache POI是一个开源项目,提供了读写Microsoft Office格式文档的能力,...

    poi excel的解析和导出工具

    1. **创建工作簿**:使用`WorkbookFactory.create()`方法可以创建一个新工作簿,选择HSSFWorkbook(对应老版本的Excel .xls格式)或XSSFWorkbook(对应新版本的Excel .xlsx格式)。 2. **添加工作表**:工作簿对象...

    java利用替换Excel2007中sheet方式导出excel,支持大数据量

    本篇文章将深入探讨如何使用Java高效地通过替换Sheet方式来导出Excel 2007文件,并重点解析提供的三个核心类:AbstractExcel2007Writer.java、Excel2007WriterImpl.java和XMLEncoder.java。 首先,我们关注“替换...

    jxl操作excel表格

    本文将深入探讨如何利用`jxl`库进行Excel表格的操作,包括读取表格、拷贝工作簿、更新工作簿以及将多个Sheet合并到一个Excel文件中。 首先,让我们了解`jxl`库的基本概念。`jxl`库提供了一系列的类和接口,如`...

    JAVA 无需JXL和POI用PageOffice自动生成Excel表格.pdf

    在`excel.jsp`中,你可以使用PageOffice提供的API来操作Excel文件。以下是一段简单的示例代码,演示如何在空白Excel文件中创建一个表格: ```java import com.zhuozhengsoft.pageoffice.FileControl; import ...

    poi导出下拉列表,数据有效性

    1. **创建工作簿和工作表**:使用`XSSFWorkbook`和` XSSFSheet `类创建Excel工作簿和工作表对象。例如: ```java XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("下拉...

    JAVA-write-EXCEL.rar_copy excel java_java write_java读取_java读取Exc

    以下是使用Apache POI进行Excel操作的基本步骤: 1. **读取Excel文件**: - 首先,引入必要的POI库依赖。 - 使用`WorkbookFactory.create()`方法打开Excel文件,它可以根据文件类型自动识别xls或xlsx格式。 - `...

    Winform中通过NPOI导出Excel的三种方式HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook示例代码.zip

    本示例将详细介绍在WinForm应用中使用NPOI导出Excel的三种主要方式:HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook。 1. HSSFWorkbook(基于HSSF): HSSFWorkbook是NPOI针对旧版Excel(.xls,BIFF8格式)的API,...

    ExcelHelper(Excel导入导出)实例源码.zip

    3. **工作簿和工作表操作**:在POI中,一个工作簿(Workbook)代表整个Excel文件,而工作表(Sheet)则是工作簿中的一页。通过`createSheet()`方法可以创建新的工作表,`getSheetAt()`或`getSheet()`用于访问已有的...

    excel导入导出,java

    Apache POI提供了HSSF(用于.xls)和XSSF(用于.xlsx)组件来操作Excel。 **导入Excel数据** 1. **创建工作簿对象**:首先,我们需要创建一个Workbook对象,这代表了Excel文件中的整个工作簿。对于.xls文件,我们...

    导出Excle表格

    本文将深入探讨如何实现“导出Excel表格”这一功能,并结合描述中的“只需要把代码拷贝到项目里面,在把数据源绑定就可以”的提示,为你提供一个简单而实用的方法。 首先,我们要理解数据导出的基本流程。这个过程...

    Execlutil.rar_文件操作_Java_

    1. **读取Excel**:使用`HSSFWorkbook`(针对旧版的.xls文件)或`XSSFWorkbook`(针对.xlsx文件)打开Excel文件,然后通过`getSheet()`方法获取工作表,并使用`getRow()`和`getCell()`方法获取行和单元格的数据。...

Global site tag (gtag.js) - Google Analytics