Excel的二次开发实例:合并Excel文件

来源:互联网 发布:js如何buttin点击次数 编辑:程序博客网 时间:2024/05/17 03:13

Excel的二次开发实例:合并Excel文件


我曾经遇到客户提出一个需求,要求将多个格式类似的Excel文件合并成一个Excel文件。

一开始觉得这个需求还是很容易实现的,使用C#封装Excel合并的VBA宏,加个循环而已。示例的VBA宏如下所示:

Sub CombineSheet()


    
Dim Files() As String
    
    
'取一个文件夹下的所有文件,这是自己写的一个函数,非VBA库函数
    Call GetFilesInDir("C:Documents and SettingsAdministrator桌面压力变送器", Files)
    
    
Dim iFile As Integer
    
Dim xBook As Excel.Workbook
    
Dim xSheet As Excel.Worksheet
    
Dim xNewBook As Excel.Workbook
    
Dim iPos As Integer
    
Dim sNewFile As String
    
Dim sSheetName As String
    
    
'目标文件
    sNewFile = "C:Documents and SettingsAdministrator桌面aaa.xls"
    
Set xNewBook = Workbooks.Add
    
Call xNewBook.SaveAs(sNewFile)
    
    Application.DisplayAlerts 
= False
    
    
For iFile = LBound(Files) To UBound(Files)
        
Set xBook = Workbooks.Open(Files(iFile))
        
        sSheetName 
= "次页"
        
Set xSheet = xBook.Worksheets(sSheetName)
        xSheet.Copy After:
=xNewBook.Worksheets(xNewBook.Worksheets.Count)
        
        sSheetName 
= "第三页"
        
Set xSheet = xBook.Worksheets(sSheetName)
        xSheet.Copy After:
=xNewBook.Worksheets(xNewBook.Worksheets.Count)
        
Call xBook.Close(False)
    
Next iFile
    
    xNewBook.Worksheets(
3).Delete
    xNewBook.Worksheets(
2).Delete
    xNewBook.Worksheets(
1).Delete

    
MsgBox "OK"

End Sub

但很快,客户就发回反馈说当合并的文件数比较多时,会提示错误“不同的单元格格式太多”,实际运行了一下,发现确实如此,即使使用VBA宏运行完毕也是同样错误,发现随着合并工作表的个数增多,分为如下三个阶段:

  1. 能够合并成功,保存后能够成功打开
  2. 能够合并成功,但保存后再打开时提示“不同的单元格格式太多”
  3. 合并过程中报错“不同的单元格格式太多”,合并无法完成

另人疑惑的是,纯使用手工合并这些文件则不会出错。

根据Microsoft提供的资料,Excel最多可使用4000种单元格格式,我在第二阶段能够合并完成,但无法打开保存文件的情况下,不保存为xls文件,而是保存为xml文件(Excel 2003以上版本支持这个功能),发现保存的xml文件中,单元格格式确实超过了4000。但仔细分析会发现,里面大量的单元格格式都是重复的。估计是使用COM接口合并文件时,Excel只是简单地把所有的格式合并在一起,而不是检查重复的情况并合并(微软程序员在偷懒)。

在这种情况下,只好自己动手合并这些格式,大致思路如下:

  1. 通过COM接口将所有的Excel文件转存为xml文件
  2. 使用C#的XML类合并这些XML文件为一个XML文件
  3. 分析目标XML文件中的单元格格式并合并重复单元格
  4. 将目标XML文件通过COM接口存为xls文件
  5. 因为XML文件不能保存Excel中的对象(图表、文本框等),需要打开源Excel文件将对象插入到目标Excel文件的合适位置

使用以上步骤后,合并成功,原先的上万个单元格格式被合并成了不到100个。

如有兴趣的朋友请email至lldwolf@163.com

 

原创粉丝点击