关于C#操作Excel,复制Sheet的记录

1.先用了NPOI,去做,HSSFWorkbook 里面有一个Copy方法,但这个只支持office2003。

对应的XSSFWorkbook没有些方法。

而且这个这个方法对devexpress导出的2003的excel文件读取不了,出现异常,需要用excel打开后,另存一下才行。

var fs = new FileStream("c://pivotGrid.xls", FileMode.Open, FileAccess.Read);
            HSSFWorkbook workbook = new HSSFWorkbook(fs);
            var sheet = workbook.GetSheetAt(0) as HSSFSheet;

            var fs2 = new FileStream("c://test3.xls", FileMode.Create);
            var workbook2 = new HSSFWorkbook();
            sheet.CopyTo(workbook2, "a", true, true);

            workbook2.Write(fs2);
            fs2.Close();

网上有些人对POI写过类似的方法:

http://blog.csdn.net/wutbiao/article/details/8696446

public class POIUtils {
//    /**
//     * 把一个excel中的cellstyletable复制到另一个excel,这里会报错,不能用这种方法,不明白呀?????
//     * @param fromBook
//     * @param toBook
//     */
//    public static void copyBookCellStyle(HSSFWorkbook fromBook,HSSFWorkbook toBook){
//        for(short i=0;i<fromBook.getNumCellStyles();i++){
//            HSSFCellStyle fromStyle=fromBook.getCellStyleAt(i);
//            HSSFCellStyle toStyle=toBook.getCellStyleAt(i);
//            if(toStyle==null){
//                toStyle=toBook.createCellStyle();
//            }
//            copyCellStyle(fromStyle,toStyle);
//        }
//    }
    /**
     * 复制一个单元格样式到目的单元格样式
     * @param fromStyle
     * @param toStyle
     */
    public static void copyCellStyle(HSSFCellStyle fromStyle,
            HSSFCellStyle toStyle) {
        toStyle.setAlignment(fromStyle.getAlignment());
        //边框和边框颜色
        toStyle.setBorderBottom(fromStyle.getBorderBottom());
        toStyle.setBorderLeft(fromStyle.getBorderLeft());
        toStyle.setBorderRight(fromStyle.getBorderRight());
        toStyle.setBorderTop(fromStyle.getBorderTop());
        toStyle.setTopBorderColor(fromStyle.getTopBorderColor());
        toStyle.setBottomBorderColor(fromStyle.getBottomBorderColor());
        toStyle.setRightBorderColor(fromStyle.getRightBorderColor());
        toStyle.setLeftBorderColor(fromStyle.getLeftBorderColor());

        //背景和前景
        toStyle.setFillBackgroundColor(fromStyle.getFillBackgroundColor());
        toStyle.setFillForegroundColor(fromStyle.getFillForegroundColor());

        toStyle.setDataFormat(fromStyle.getDataFormat());
        toStyle.setFillPattern(fromStyle.getFillPattern());
//        toStyle.setFont(fromStyle.getFont(null));
        toStyle.setHidden(fromStyle.getHidden());
        toStyle.setIndention(fromStyle.getIndention());//首行缩进
        toStyle.setLocked(fromStyle.getLocked());
        toStyle.setRotation(fromStyle.getRotation());//旋转
        toStyle.setVerticalAlignment(fromStyle.getVerticalAlignment());
        toStyle.setWrapText(fromStyle.getWrapText());

    }
    /**
     * Sheet复制
     * @param fromSheet
     * @param toSheet
     * @param copyValueFlag
     */
    public static void copySheet(HSSFWorkbook wb,HSSFSheet fromSheet, HSSFSheet toSheet,
            boolean copyValueFlag) {
        //合并区域处理
        mergerRegion(fromSheet, toSheet);
        for (Iterator rowIt = fromSheet.rowIterator(); rowIt.hasNext();) {
            HSSFRow tmpRow = (HSSFRow) rowIt.next();
            HSSFRow newRow = toSheet.createRow(tmpRow.getRowNum());
            //行复制
            copyRow(wb,tmpRow,newRow,copyValueFlag);
        }
    }
    /**
     * 行复制功能
     * @param fromRow
     * @param toRow
     */
    public static void copyRow(HSSFWorkbook wb,HSSFRow fromRow,HSSFRow toRow,boolean copyValueFlag){
        for (Iterator cellIt = fromRow.cellIterator(); cellIt.hasNext();) {
            HSSFCell tmpCell = (HSSFCell) cellIt.next();
            HSSFCell newCell = toRow.createCell(tmpCell.getCellNum());
            copyCell(wb,tmpCell, newCell, copyValueFlag);
        }
    }
    /**
    * 复制原有sheet的合并单元格到新创建的sheet
    *
    * @param sheetCreat 新创建sheet
    * @param sheet      原有的sheet
    */
    public static void mergerRegion(HSSFSheet fromSheet, HSSFSheet toSheet) {
       int sheetMergerCount = fromSheet.getNumMergedRegions();
       for (int i = 0; i < sheetMergerCount; i++) {
        Region mergedRegionAt = fromSheet.getMergedRegionAt(i);
        toSheet.addMergedRegion(mergedRegionAt);
       }
    }
    /**
     * 复制单元格
     *
     * @param srcCell
     * @param distCell
     * @param copyValueFlag
     *            true则连同cell的内容一起复制
     */
    public static void copyCell(HSSFWorkbook wb,HSSFCell srcCell, HSSFCell distCell,
            boolean copyValueFlag) {
        HSSFCellStyle newstyle=wb.createCellStyle();
        copyCellStyle(srcCell.getCellStyle(), newstyle);
        distCell.setEncoding(srcCell.getEncoding());
        //样式
        distCell.setCellStyle(newstyle);
        //评论
        if (srcCell.getCellComment() != null) {
            distCell.setCellComment(srcCell.getCellComment());
        }
        // 不同数据类型处理
        int srcCellType = srcCell.getCellType();
        distCell.setCellType(srcCellType);
        if (copyValueFlag) {
            if (srcCellType == HSSFCell.CELL_TYPE_NUMERIC) {
                if (HSSFDateUtil.isCellDateFormatted(srcCell)) {
                    distCell.setCellValue(srcCell.getDateCellValue());
                } else {
                    distCell.setCellValue(srcCell.getNumericCellValue());
                }
            } else if (srcCellType == HSSFCell.CELL_TYPE_STRING) {
                distCell.setCellValue(srcCell.getRichStringCellValue());
            } else if (srcCellType == HSSFCell.CELL_TYPE_BLANK) {
                // nothing21
            } else if (srcCellType == HSSFCell.CELL_TYPE_BOOLEAN) {
                distCell.setCellValue(srcCell.getBooleanCellValue());
            } else if (srcCellType == HSSFCell.CELL_TYPE_ERROR) {
                distCell.setCellErrorValue(srcCell.getErrorCellValue());
            } else if (srcCellType == HSSFCell.CELL_TYPE_FORMULA) {
                distCell.setCellFormula(srcCell.getCellFormula());
            } else { // nothing29
            }
        }
    }
}

2.用微软的API实现复制:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTestExcel
    {
        [TestMethod]
        public void TestMethod1()
        {

            Excel.Application app = new Excel.Application();

            Excel.Workbook workbook1 = app.Workbooks._Open("C:\\a.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing
                 , Type.Missing, Type.Missing, Type.Missing, Type.Missing
                 , Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            Excel.Worksheet sheet1 = workbook1.Worksheets["Sheet1"] as Excel.Worksheet;

            Excel.Workbook workbook2 = app.Workbooks._Open("C:\\a1.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing
                , Type.Missing, Type.Missing, Type.Missing, Type.Missing
                , Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            Excel.Worksheet sheet2 = workbook2.Worksheets["Sheet1"] as Excel.Worksheet;

            sheet2.Copy(Type.Missing, sheet1);

            workbook1.Save();
            workbook1.Close(false, Type.Missing, Type.Missing);
            workbook2.Close(false, Type.Missing, Type.Missing);
        }
    }
}
时间: 2024-10-24 13:18:39

关于C#操作Excel,复制Sheet的记录的相关文章

使用NPOI操作Excel(03、07)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using NPOI.SS.UserModel; 6 using NPOI.XSSF.UserModel; 7 using NPOI.HSSF.UserModel; 8 using System.IO; 9 using System.Data; 10 using NPOI.SS.Util; 11 12 na

用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法长时间做某种重复性的枯燥操作.想象这样一个场景,我们有个几千行的表要填,需要根据姓名输入其对应的身份证号,但之前我们已经做过一个类似的表,同样的一些人的姓名跟身份证号是完整的,那么我们就需要通过一个个查找姓名,然后把身份证号码复制到我们当前要做的表里去. 当我日复一日重复着这些操作的时候,我都很想有

Delphi对Excel复制粘贴操作纠错

本人学一下delphi怎么操作excel表格,正好要用到表格的复制粘贴功能,然后在网上找博客学习,结果找了以后发现基本上博客都是一个抄一个的,这样子我都不说什么了,问题是抄的很多 是错误的,误导了我两天.下面,我针对这些错误纠错一下,我不敢保证我说的对不对.全不全,反正我下面写的代码都是可以运行的. Var wb1 : Variant; wb2 : Variant; vsheet1 , vsheet2: Variant; range1 , range2 : Variant; 打开并显示表格就不多

自己封装的poi操作Excel工具类

该工具类主要完成的功能是:读取Excel.汇总Excel的功能.在读取时,可以设定开始和结束读取的位置.设定是否读取多个sheet.设定读取那个或者那些sheet等.在汇总时,如设定是否覆盖目标文件.设定是否比较检查重复内容.设定检查重复的列索引等功能. package com.tgb.ccl.excel.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; impo

C#操作Excel文件(转)

摘要:本文介绍了Excel对象.C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用. 关键词:受管代码:非受管代码:Excel对象:动态连接库 引言 Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格. Excel以其功能强大,界面友好等受到了许多用户的欢迎.在设计应用系统时,对于不同的用户,他们对于打印的需求是不一样的,如果要使得程序中的打印功 能适用于每一个用户,可以想象程序设计是十分复杂的.由于Excel表格的功能强大,又由于几乎每一台机器都安装了

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

POI操作EXCEL(二)

原文转自:http://www.tqcto.com/article/code/295025.html java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境.然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位.或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼.还好 在POI HSSF中考虑到这个问题,可以设置encoding为双字节. POI可以到www.apache.org

Java生成和操作Excel文件

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6