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

简介: 原文:VSTO学习笔记(五)批量编辑Excel 2010 x64近期因为工作的需要,经常要批量处理大量的Excel文件,如果纯手工一个个修改,非常的麻烦,于是写了这么一个帮助类,希望能对你有所帮助。里面很多方法可以进一步推广,增减适当的参数,部分方法用到了C# 4.0新特性,如果需要调试,请安装Visual Studio 2010。
原文: 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;

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  Microsoft.Office.Interop.Excel;
using  System.Drawing;
using  System.IO;

namespace  ExcelHelp
{
    
///   <summary>
    
///  Date: 2010.03.31
    
///  Author: Mr.Brooks
    
///  HomePage:  http://www.cnblogs.com/brooks-dotnet/
    
///  Email: undead_47@163.com
    
///   </summary>
     class  ExcelHelp
    {
        
///   <summary>
        
///  将一个工作簿中一个工作表中的内容复制到另一个工作簿的一个工作表中
        
///   </summary>
        
///   <param name="v_strSourceWorkbook"> 源工作薄的完整路径 </param>
        
///   <param name="v_strSourceWorksheet"> 源工作表名 </param>
        
///   <param name="v_strDestWorkbook"> 目标工作薄的完整路径 </param>
        
///   <param name="v_strDestWorksheet"> 目的工作表名 </param>
         private   static   void  fnCopy( string  v_strSourceWorkbook,  string  v_strSourceWorksheet,  string  v_strDestWorkbook,  string  v_strDestWorksheet)
        {
            Application app 
=   new  Application();
            Workbook srcbook 
=  app.Workbooks.Open(v_strSourceWorkbook);
            Worksheet srcsheet 
=  srcbook.Worksheets[v_strSourceWorksheet];

            Workbook destbook 
=  app.Workbooks.Open(v_strDestWorkbook);
            Worksheet destsheet 
=  destbook.Worksheets[v_strDestWorksheet];

            
try
            {
                
// Worksheet.UsedRange: 获取工作表中所使用的范围
                 for  ( int  i  =   1 ; i  <=  srcsheet.UsedRange.Rows.Count; i ++ )
                {
                    
for  ( int  j  =   1 ; j  <=  srcsheet.UsedRange.Columns.Count; j ++ )
                    {
                        
// 将Excel的颜色与RGB联系起来
                         if  (srcsheet.Cells[i, j].Interior.Color  !=  ColorTranslator.ToOle(Color.FromArgb( 255 204 153 )))
                        {
                            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 != ColorTranslator.ToOle(Color.FromArgb(255204153))

将ColorIndex与RGB进行关联。

 

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
         ///   <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 加密技术。

 

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
         ///   <summary>
        
///  判断一个工作表中所有的单元格是否包含公式
        
///   </summary>
        
///   <param name="v_strPath"> 工作簿的完整路径 </param>
         private   static   void  fn判断单元格是否包含公式( string  v_strPath)
        {
            StringBuilder sb 
=   new  StringBuilder();
            Application app 
=   new  Application();
            DirectoryInfo dir 
=   new  DirectoryInfo(v_strPath);

            
try
            {
                
foreach  (FileInfo file  in  dir.GetFiles( " *.xlsx " , SearchOption.AllDirectories))
                {
                    Workbook book 
=  app.Workbooks.Open(file.FullName);
                    
foreach  (Worksheet sheet  in  book.Worksheets)
                    {
                        
for  ( int  i  =   1 ; i  <  sheet.UsedRange.Rows.Count; i ++ )
                        {
                            
for  ( int  j  =   1 ; j  <  sheet.UsedRange.Columns.Count; j ++ )
                            {
                                
if  (sheet.Cells[i, j].Interior.Color  !=  ColorTranslator.ToOle(Color.FromArgb( 255 204 153 )))
                                {
                                    
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());
        }

 

 

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
         ///   <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的格式

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
         ///   <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();
            }
        }

 

 

比较两个工作表的内容

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
         ///   <summary>
        
///  比较两个工作表的内容
        
///   </summary>
        
///   <param name="v_strSourcePath"> 第一个工作簿的路径 </param>
        
///   <param name="v_strDestPath"> 第二个工作簿的路径 </param>
         private   static   void  fn比较两个工作表的内容( string  v_strSourcePath,  string  v_strDestPath)
        {
            Application app 
=   new  Application();
            Workbook srcBook 
=  app.Workbooks.Open(v_strSourcePath);
            Workbook destBook 
=  app.Workbooks.Open(v_strDestPath);

            
// 记录查找结果到本文文件中
            FileStream fs  =   new  FileStream( " log.txt " , FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter sw 
=   new  StreamWriter(fs);

            
try
            {
                
foreach  (Worksheet sheet  in  srcBook.Worksheets)
                {
                    
for  ( int  i  =   1 ; i  <=  sheet.UsedRange.Rows.Count; i ++ )
                    {
                        
for  ( int  j  =   1 ; j  <=  sheet.UsedRange.Columns.Count; j ++ )
                        {
                            
if  (sheet.Cells[i, j].Interior.Color  !=  ColorTranslator.ToOle(Color.FromArgb( 255 204 153 )))
                            {
                                
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中的操作。

目录
相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
2024年纯前端VUE在线编辑微软Office/金山WPS的Word/Excel文档
现在,随着数字化进程渗透到到各行各业,数据安全已经成为了数字化革命中的重要组成部分,而在线Office成在OA、ERP、文档系统中得到了广泛的应用,为我国的信息化事业也做出了巨大贡献。随着操作系统、浏览器及Office软件的不断升级和更新换代,加上国家对信息化、数字化系统要求的不断提升,一些厂家的WebOffice控件产品不断被淘汰出局,而现存的几个产品也存在以下几个问题:
416 1
2024年纯前端VUE在线编辑微软Office/金山WPS的Word/Excel文档
|
3月前
|
缓存 Java 数据安全/隐私保护
当前仍在编辑文章 - Java Excel处理 - 实操案例与方法手册
当前仍在编辑文章 - Java Excel处理 - 实操案例与方法手册
78 0
|
4月前
在word、ppt、excel编辑软件标题栏顶部左上角加入自定义功能:另存为、导出PDF
在word、ppt、excel编辑软件标题栏顶部左上角加入自定义功能:另存为、导出PDF
|
4月前
|
数据管理
宜搭流程中,数据管理批量发起如何成功导入 年-月-日 时:分格式数据 当前数据管理批量发起,Excel文本中编辑时间格式如2023-12-07 20:00,批量导入生成后显示为20231207 00:00,请问如何让时:分正确显示。
宜搭流程中,数据管理批量发起如何成功导入 年-月-日 时:分格式数据 当前数据管理批量发起,Excel文本中编辑时间格式如2023-12-07 20:00,批量导入生成后显示为20231207 00:00,请问如何让时:分正确显示。
61 2
|
9月前
|
存储 C语言
ArcGIS:Excel/Txt 文件生成点图层、属性表编辑的基本方法、属性表之间的连接(合并)和关联的操作、属性表的字段计算器的使用
ArcGIS:Excel/Txt 文件生成点图层、属性表编辑的基本方法、属性表之间的连接(合并)和关联的操作、属性表的字段计算器的使用
182 0
|
运维 搜索推荐 前端开发
一分钟自建应用-从Excel创建|学习笔记
快速学习一分钟自建应用-从Excel创建
84 0
一分钟自建应用-从Excel创建|学习笔记
|
Web App开发 JSON 前端开发
2022年谷歌Chrome等浏览器在线打开编辑保存微软Office/金山WPS的Word、Excel和PPT方案大全
长久以来,在IE、Chrome 45及Firefox 53以下版本的浏览器网页中,可直接或间接调用微软免费开源的ActiveX控件DsoFramer或参考DsoFramer实现的一些收费NPAPI办公插件即可嵌入本地安装的Office桌面软件实现在线编辑或审阅Office文档。随着Windows系统及Office软件的不断升级,DsoFramer的稳定性和兼容性问题越来越多,
363 0
2022年谷歌Chrome等浏览器在线打开编辑保存微软Office/金山WPS的Word、Excel和PPT方案大全
|
Python
Python学习笔记(26)-读取excel表格信息
本文目录 1. excel表格中的相关概念 2. Python中openpyxl模块对excel表格的处理 3. openpyxl模块的安装 4. openpyxl模块对.xls和.xlsx的支持 5. 读取excel表格的信息
155 0
Python学习笔记(26)-读取excel表格信息
|
C#
C# 如何在Excel表格中插入、编辑和删除批注
概述 为文档添加必要的批注可以给文档使用者提供重要的提示信息,下面的示例中,将介绍通过C#编程语言来给Excel表格中的指定单元格内容添加批注,此外,对于已有的批注,如果需要修改,我们也可以进行编辑或者删除批注。
2117 0