一个网站的诞生- MagicDict开发总结7 [Excel 是我的好朋友]

可能由于长期从事对日软件的开发,Excel不知不觉已经成为开发工作的一个不可或缺的软件。从某种意义上说,Office等于Excel了。

在整个网站的开发中,数据的整理基本上是Excel表格为基础的,庞大的数据放在Excel里面进行编辑。对于一些繁琐的机械化的操作,则交给VBA了。但是由于VBA的种种限制,一些很复杂的操作最后还是落到了.NET身上,使用.NET操作Excel。

这里就分享一些Excel的小技巧和注意点:

第一:对于Unicode字符的处理。

        由于VBA的代码不支持Unicode,所以,当你在VBA的代码里面写上日语字符的时候,他们会变成 ? 【日语操作系统的话,则不会。。。】这个时候最常用的一个方法是,你可以定义一个字符变量,然后,把你想使用的Unicode的值放在某个Excel的单元格里面,然后在程序里面把这个单元格的值赋给这个变量,这样你就可以使用那个Unicode的文字列了。

更改前 

    IF  A = "???" THEN

更改后


    Dim strA as String 

    strA 
= Cells(1,1).Text

    
If A = strA THEN

第二:

     由于Excel速度不是很快,请一定使用 Application.Status 来定期显示你的工作进度。例如你要处理10W行记录,你应该每 5000行显示一下进度。最好每5000行操作后,保存一下结果。


     If RowCount Mod 5000 = 0 then
         Application.StatusBar 
= "Process:" & RowCount
     
End IF

 

 第三:

       XLS一张表格最多可以放65535行,Excel2007开始支持一张表格放10W行数据。.xlsx的文件可以使用WPS打开,不过,最多还是只能显示65535行,WPS不给力啊。

 

由于VBA的限制,有时候一些复杂操作,还是要交给NET来做的。。。使用.NET来控制Excel:

操作方法很简单

1.建立一个Excel对象,打开你想操作的文件

        objExcel = CreateObject("Excel.Application")
        
'Check The Chinese is Exist in Sentence
        objExcel.Workbooks.Open(XlsFileName)
        objExcel.Visible 
= False

 2.为所欲为的操作Excel,最后关闭

       Dim RowCount As Integer
        
Dim strWord As String = String.Empty
        objExcel.WorkBooks(
1).Activate()
        objExcel.WorkBooks(
1).worksheets(1).Select()
        
With objExcel.WorkBooks(1).worksheets(1)
            RowCount 
= 2
            
Do While .Cells(RowCount, 2).Text <> ""
                
If RowCount = 351 Then
                    Debug.Assert(
True)
                
End If
                
If .Cells(RowCount, 4).Text <> "" Then
                    strWord 
= .Cells(RowCount, 4).Text
                    strWord 
= StrConv(strWord, VbStrConv.Hiragana, 1041)
                    
If OnlyKana(strWord) Then
                        .Cells(RowCount, 
4).value = ""
                        .Cells(RowCount, 
5).value = strWord
                    
End If
                
End If
                RowCount 
= RowCount + 1
            
Loop
        
End With
        objExcel.Workbooks.Close()

 3.上面这些操作地球人都知道。但是,有一个objExcel对象的释放问题,请一定要记住:

     A.在objExcel使用完毕后,如果不回收垃圾的话,后台进程里面会有一个 EXCEL 的进程。

     B.垃圾回收的语句和创建objExcel的语句不能放在一个方法里面。【垃圾回收无法回收同一个方法里面的对象】

    Private Sub cmdCheckData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCheckData.Click
        CheckData()
        objExcel 
= Nothing
        GC.Collect()
    
End Sub

 就像上面那样,一定要在CheckData里面创建objExcel对象,然后在GC.Collect()才能正确回收。。。

 

自制的操作Excel的数据整理工具


 

 网站第二阶段研发开始了,懂日语的童鞋,能和我一起做吗?

有兴趣的写信给我 root#magicdict.com   [convert # to @ ]

或者加MSN mynightelfplayer@hotmail.com

网站地址 http://www.magicdict.com/

 

posted @ 2011-06-03 16:34  灰毛毛  阅读(1732)  评论(1编辑  收藏  举报