编程操作EXCEL,都是通过COM的,也就是调用系统的EXCEL组件功能。一般能处理为文本的数据库数据很容易导入EXCEL,毕竟OFFICE组件也是个大项目。但处理从ACCESS表倒数据,要带图片,效率就不行了。工作需要,花了一个月时间分析EXCEL并编程,特做小结以记录。
EXCEL xls文件是按复合文档的二进制格式存在的,有关复合文档的中文资料较多,内容也比较容易理解。EXCEL的“业务内容”实际上都在Workbook流里面,我的结论是只需要个Workbook流(不需要什么SummaryInfo流)就能生成EXCEL文件了。Workbook流里面也就是一条接一条的BIFF记录了,2003是BIFF8。BIFF等OFFICE格式,微软在几年前就公开了,但却没能找到中文文档。有一个柳州什么畜牧学院的翻译了一个BIFF8格式说明,挺好的,但分析BIFF8格式,用BIFFVIEW工具再配上E文文档还是王道。
当能把XLS文件的内容分析成一条接一条的BIFF8记录以后,感觉好象豁然开朗了。但真正的麻烦在后头:BIFF8的记录种类很多,每一种就算是两三百字节的记录,都可能包含大量要处理的信息,比如其中一个字段在某种值的情况下,其后面的内容会对应着各种不同的结构,而每个结构又可能有多种变换。。。当然,本文不是来拆台的,主要还是讲一些分析结果。
针对BCB导ACCESS数据表的分析,有图和没图的xls的区别:BIFF8记录只增加几条有限的新记录。原有记录的种类、位置和尺寸不变,原有记录的内容也大都不变。该类表只有BOUNDSHEET记录和EXTSST记录中保存流偏移的字段被重新计算,计算的原理也较简单。有图的xls增加了MSODRAWINGGROUP记录在较靠前的部分,所有图片的数据信息都在里面了。如果文件里有相同的图片,在这个记录里保存一份就可以了。每个实际图片都有两个记录组成,一个MSODRAWING和一个OBJ,有关MSODRAWINGGROUP和MSODRAWING的内容解析形式都一致的,都在OFFICE 图片格式E文文档里查找。 MSODRAWINGGROUP只有一个(尺寸过大会被CONTINUE记录处理),实际图片的MSODRAWING和OBJ连续存放,就是前一张图的MSODRAWING和OBJ后紧接着下一个图的这两个记录,而不论图片在EXCEL表里的位置如何。其实“第一张图片”的MSODRAWING里包含了所有MSODRAWING的总尺寸。
各字段的结构基本都可以查文档查到,虽然可能链接到好几个内容才能解析,虽然有些最后链接也解释不详。值得一说的是,在我这里,MSODRAWING结构类型为F010的结构,第一个WORD如果是01就是图片随单元格改变大小,为02就不随。后面4个DWORD分别是LEFT、TOP、RIGHT、BOTTOM,我的分析结果是DWORD的前一WORD是单元格索引,后一WORD是与该单元格的偏移。
还有不少细节,用文字不好表达,画表做实例要好,就等下回再说了。
EXCEL xls文件是按复合文档的二进制格式存在的,有关复合文档的中文资料较多,内容也比较容易理解。EXCEL的“业务内容”实际上都在Workbook流里面,我的结论是只需要个Workbook流(不需要什么SummaryInfo流)就能生成EXCEL文件了。Workbook流里面也就是一条接一条的BIFF记录了,2003是BIFF8。BIFF等OFFICE格式,微软在几年前就公开了,但却没能找到中文文档。有一个柳州什么畜牧学院的翻译了一个BIFF8格式说明,挺好的,但分析BIFF8格式,用BIFFVIEW工具再配上E文文档还是王道。
当能把XLS文件的内容分析成一条接一条的BIFF8记录以后,感觉好象豁然开朗了。但真正的麻烦在后头:BIFF8的记录种类很多,每一种就算是两三百字节的记录,都可能包含大量要处理的信息,比如其中一个字段在某种值的情况下,其后面的内容会对应着各种不同的结构,而每个结构又可能有多种变换。。。当然,本文不是来拆台的,主要还是讲一些分析结果。
针对BCB导ACCESS数据表的分析,有图和没图的xls的区别:BIFF8记录只增加几条有限的新记录。原有记录的种类、位置和尺寸不变,原有记录的内容也大都不变。该类表只有BOUNDSHEET记录和EXTSST记录中保存流偏移的字段被重新计算,计算的原理也较简单。有图的xls增加了MSODRAWINGGROUP记录在较靠前的部分,所有图片的数据信息都在里面了。如果文件里有相同的图片,在这个记录里保存一份就可以了。每个实际图片都有两个记录组成,一个MSODRAWING和一个OBJ,有关MSODRAWINGGROUP和MSODRAWING的内容解析形式都一致的,都在OFFICE 图片格式E文文档里查找。 MSODRAWINGGROUP只有一个(尺寸过大会被CONTINUE记录处理),实际图片的MSODRAWING和OBJ连续存放,就是前一张图的MSODRAWING和OBJ后紧接着下一个图的这两个记录,而不论图片在EXCEL表里的位置如何。其实“第一张图片”的MSODRAWING里包含了所有MSODRAWING的总尺寸。
各字段的结构基本都可以查文档查到,虽然可能链接到好几个内容才能解析,虽然有些最后链接也解释不详。值得一说的是,在我这里,MSODRAWING结构类型为F010的结构,第一个WORD如果是01就是图片随单元格改变大小,为02就不随。后面4个DWORD分别是LEFT、TOP、RIGHT、BOTTOM,我的分析结果是DWORD的前一WORD是单元格索引,后一WORD是与该单元格的偏移。
还有不少细节,用文字不好表达,画表做实例要好,就等下回再说了。