原文:VSTO学习笔记(五)批量编辑Excel 2010 x64

近期因为工作的需要,经常要批量处理大量的Excel文件,如果纯手工一个个修改,非常的麻烦,于是写了这么一个帮助类,希望能对你有所帮助。里面很多方法可以进一步推广,增减适当的参数,部分方法用到了C# 4.0新特性,如果需要调试,请安装Visual Studio 2010。

示例代码下载

本系列所有示例代码均在 Visual Studio 2010 Ultimate RC + Office 2010 Professional Plus Beta x64 上测试通过。

首先添加引用:

using Microsoft.Office.Interop.Excel;

using System.Drawing;

using System.IO;

代码

)))
                        {
                            destsheet.Cells[i, j].Value2 = srcsheet.Cells[i, j].Value2;
                        }
                    }
                }
                //屏蔽Excel的提示信息
                app.Application.DisplayAlerts = false;
                destbook.Save();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally 
            {
                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(srcbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(srcsheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(destbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(destsheet);

                app = null;
                srcbook = null;
                destbook = null;
                srcsheet = null;
                destsheet = null;
                GC.Collect();
            }
        }

Range.Interior.Color是Office中表示颜色的方法,其返回一个整数,表示一种特定的颜色:

但是我们平时用的最多的是RGB表示的颜色,可以用

srcsheet.Cells[i, j].Interior.Color ))

将ColorIndex与RGB进行关联。

代码

        /// <summary>
        /// 判断一个工作簿的一个工作表有没有添加保护
        /// </summary>
        /// <param name="v_strDir">工作簿的完整路径</param>
        /// <param name="v_strSheetName">工作表名</param>
        private static void fn判断工作表是否被保护(string v_strDir, string v_strSheetName)
        {
            StringBuilder sb = new StringBuilder();
            Application app = new Application();
            DirectoryInfo dir = new DirectoryInfo(v_strDir);

            try
            {
                //递归查找所有Excel 2007/2010的文件
                foreach (FileInfo f in dir.GetFiles("*.xlsx", SearchOption.AllDirectories))
                {
                    Workbook book = app.Workbooks.Open(f.FullName);
                    if (book.Worksheets[v_strSheetName].ProtectContents)
                    {
                        sb.Append(book.Name + ",");
                    }
                    app.Application.DisplayAlerts = false;
                    book.Save();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                app = null;
                GC.Collect();
            }

            Console.WriteLine(sb.ToString());
        }

若不知道Excel工作簿或工作表的密码,可以用Passware进行破解,经过测试,Passware 可以破解Office 2003/2007/2010,其官方主页称可以破解Windows 7 的 BitLocker 加密技术。

代码

)))
                                {
                                    if (sheet.Cells[i, j].HasFormula)
                                    {
                                        sb.Append(book.Name + " " + sheet.Name + " 第" + i.ToString() + "行第" + j.ToString() + "列包含公式!\n");
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                app = null;
                GC.Collect();
            }

            Console.WriteLine(sb.ToString());
        }
代码

        /// <summary>
        /// 获取指定工作簿的所有工作表
        /// </summary>
        /// <param name="v_strDir">工作簿的完整路径</param>
        private static void fn获取指定工作簿的所有工作表(string v_strDir)
        {
            StringBuilder sb = new StringBuilder();
            Application app = new Application();
            DirectoryInfo dir = new DirectoryInfo(v_strDir);

            try
            {
                foreach (FileInfo f in dir.GetFiles("*.xlsx", SearchOption.AllDirectories))
                {
                    Workbook book = app.Workbooks.Open(f.FullName);
                    sb.Append(book.Name);
                    foreach (Worksheet sheet in book.Worksheets)
                    {
                        sb.Append(sheet.Name + " ");
                    }
                    sb.Append("\n");
                    app.Application.DisplayAlerts = false;
                    book.Save();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                app = null;
                GC.Collect();
            }

            Console.WriteLine(sb.ToString());
        }

批量转换Excel的格式

代码

        /// <summary>
        /// 批量转换Excel 2003 至Excel 2007/2010格式
        /// 可以修改XlFileFormat枚举的值来转换为想要的格式
        /// </summary>
        /// <param name="v_strDir">工作簿的查找路径</param>
        private static void fn批量转换Excel文件格式(string v_strDir)
        {
            Application app = new Application();
            DirectoryInfo dir = new DirectoryInfo(v_strDir);
            Workbook book;
            app.Application.DisplayAlerts = false;

            try
            {
                foreach (FileInfo fi in dir.GetFiles("*.xls", SearchOption.AllDirectories))
                {
                    book = app.Workbooks.Open(fi.FullName);
                    book.SaveAs(fi.DirectoryName + @"\" + fi.Name.Replace(fi.Extension, string.Empty) + ".xlsx", XlFileFormat.xlOpenXMLWorkbook);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                app = null;
                GC.Collect();
            }
        }

比较两个工作表的内容

代码

)))
                            {
                                string src = sheet.Cells[i, j].Value == null ? string.Empty : sheet.Cells[i, j].Value.ToString();
                                string dest = destBook.Worksheets[sheet.Name].Cells[i, j].Value == null ? string.Empty : destBook.Worksheets[sheet.Name].Cells[i, j].Value.ToString();

                                if (src != dest)
                                {
                                    sw.WriteLine(@"当前工作表: " + sheet.Name + " 第" + i + "行" + j + "列数据不相同!");
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally 
            {
                sw.Flush();
                sw.Close();
                app.Application.DisplayAlerts = false;
                srcBook.Save();
                destBook.Save();

                app.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(srcBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(destBook);
                app = null;
                srcBook = null;
                destBook = null;
                GC.Collect();
            }
        }

小结:

本次通过一系列的实例探讨了Excel的操作方法,我觉得还挺实用,你可以根据需求进行完善。代码仅供测试,如果欲操作的Excel数量巨大,请谨慎使用。

后续篇章我会继续研究Excel中的操作。

VSTO学习笔记(五)批量编辑Excel 2010 x64的更多相关文章

  1. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

  2. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  3. 【VS开发】VSTO 学习笔记(十)Office 2010 Ribbon开发

    微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个Ribbon中,便于集中管理.操作.这种Ribbon是高度可定制的,用户可 ...

  4. VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

    原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...

  5. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表

    原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...

  6. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  7. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  8. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  9. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

随机推荐

  1. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

  2. Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)

    想要给图片添加文字水印或者注释,我们需要实现在UIImage上写字的功能. 1,效果图如下: (在图片左上角和右下角都添加了文字.) 2,为方便使用,我们通过扩展UIImage类来实现添加水印功能 ( ...

  3. Linux Kbuild工作原理分析(以DVSDK生成PowerVR显卡内核模块为例)

    一.引文 前篇博文<Makefile之Linux内核模块的Makefile写法分析>,介绍了Linux编译生成内核驱动模块的Makefile的写法,但最近在DVSDK下使用Linux2.6 ...

  4. 14.10.4 Defragmenting a Table 整理表

    14.10.4 Defragmenting a Table 整理表: 随机插入或者删除从一个secondary index 可以导致index变的fragmented Fragmentation意味着 ...

  5. UVA 6480 Zombie Invasion(模拟退火)

    A group of survivors has arrived by helicopter to an isolated island. The island is made up of a lon ...

  6. 碰撞回避算法(一) Velocity Obstacle

    碰撞回避是机器人导航,游戏AI等领域的基础课题.几十年来,有很多算法被提出.注意这里主要指的是局部的碰撞回避算法.尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系.可是还是有所不同的(局部的碰撞 ...

  7. Flex上传文件

    前几天写了一篇jsp页面利用ajaxFileUpload上传文件.如今把flex上传页面也分享出来: 前台页面 <?xml version="1.0" encoding=&q ...

  8. java对象引用传递和值传递的一些总结

    1.对象作为函数的参数传递过去的时候,是以原对象的引用的方式传递的,更改参数对象的值,会影响原来的对象. 2.对象作为函数的返回值的时候,传递过来的也是一个引用传递,更改传递过来的对象的时候,会影响原 ...

  9. abap优化工具事务代码: ST05

  10. 在DLL动态链接库中封装VCL的MDI子窗体

    在DLL动态链接库中封装VCL的MDI子窗体不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下 ...