VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
标签:
原文:VSTO学习笔记(七)基于WPF的Excel分析、转换小程序近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率。
小程序的功能是对Excel进行一些分析、验证,然后进行转换。
概述
小程序主界面如下:
首先选择一个日期和类别,从命名上对待分析的Excel文件进行过滤。点击【浏览】选择待分析的Excel文件所在的目录,
程序中会获取所有子目录。然后点击【执行分析】就会按照左边CheckBox中的选择进行分析,分析结果显示在每一行中间。【修改配置】可以对分析规则进行设置,此处还未完善,后续再改进。分析结束后点击【执行转换】可以将Exce转换为我们需要的格式和内容,去除只读、重命名、转换格式、去除保护、去除公式、显示零设置等。
主要对Excel做如下几种分析:
只读分析:判断Excel的文件属性是否为只读;
命名分析:判断Excel的文件名是否符合既定规范,包含的工作表是否在有效值列表中;
格式分析:判断Excel的格式是否符合既定规范(是哪一种Excel,2003?2007?)
保护分析:判断Excel是否包含工作簿保护、工作表保护;
公式分析:判断Excel的单元格中是否包含公式;
显示零分析:判断Excel中的工作表是否设置为零值显示。
前五种都比较好理解,只有最后一种"显示零分析"需要介绍一下。
"显示零"是指什么呢?在Excel中,若单元格中包含的数值为0,则可以通过设置来决定0值是否显示,这种设置在某些情况下是有意义的。以Excel 2010为例,我们来看一下怎么设置"零值显示" :
2.1、随便打开一个Excel 2010文件,点击【File】 -->【Options】:
2.2、在【Advanced】选项卡中,找到【Display options for this worksheet】,选中或取消【Show a zero in cells that have zero value】,点击【OK】即可:
注意这种设置是工作表级别的,即当前设置只对所选择工作表有效。为什么要单独做这种分析呢?若一个工作表中有大量的区域都包含零值,此时若设置为零值显示则会使得工作表的内容非常杂乱,影响美观;其他情况下我们设置为零值显示,这样方便程序处理,即读取或写入单元格中的数值。
分析完成后会显示出分析结果,并可以【查看明细】按钮来查看具体的内容,可以精确到单元格,如XX单元格包含公式,公式是什么;XX工作表包含保护等。其中公式的分析结果会记录日志,方便查看。
程序中有一个全局配置文件GolbalConfig.xml,来存储分析规则,其他的一些配置信息等:
代码
<?xml version="1.0" encoding="utf-8" ?>
<ExcelValidate>
<SelectedDate></SelectedDate>
<ReportKind>
<Report name="不限"></Report>
<Report name="储备"></Report>
<Report name="吨煤"></Report>
<Report name="汇总"></Report>
</ReportKind>
<ReportNames>
<ReportName IsSum="true" reg="^\d{1,2}月汇总表.xlsx?$">
<SheetNames>
<SheetName name="累计库存"></SheetName>
<SheetName name="累计消耗"></SheetName>
<SheetName name="原煤1 "></SheetName>
<SheetName name="各业务科平均库存储备资金统计 "></SheetName>
<SheetName name="各业务科库存储备资金统计"></SheetName>
<SheetName name="累计库存资金统计报表"></SheetName>
<SheetName name="累计消耗资金统计报表"></SheetName>
<SheetName name="本月库存资金统计报表"></SheetName>
<SheetName name="本月消耗资金统计报表"></SheetName>
<SheetName name="库存储备资金完成情况统计表"></SheetName>
<SheetName name="各单位平均库存储备资金统计表"></SheetName>
<SheetName name="各单位吨煤材料费"></SheetName>
<SheetName name="各业务科吨煤材料费"></SheetName>
<SheetName name="产量进尺表"></SheetName>
<SheetName name="全局1表"></SheetName>
<SheetName name="煤业1表"></SheetName>
<SheetName name="全局2表"></SheetName>
<SheetName name="煤业2表"></SheetName>
<SheetName name="袁庄矿1表"></SheetName>
<SheetName name="朱庄矿1表"></SheetName>
<SheetName name="杨庄矿1表"></SheetName>
<SheetName name="芦岭矿1表"></SheetName>
<SheetName name="朱仙庄1表"></SheetName>
<SheetName name="童亭矿1表"></SheetName>
<SheetName name="桃园矿1表"></SheetName>
<SheetName name="祁南矿1表"></SheetName>
<SheetName name="许疃矿1表"></SheetName>
<SheetName name="涡北矿1表"></SheetName>
<SheetName name="孙疃矿1表"></SheetName>
<SheetName name="淮选厂1表"></SheetName>
<SheetName name="临选厂1表"></SheetName>
<SheetName name="铁运处1表"></SheetName>
<SheetName name="工程处1表"></SheetName>
<SheetName name="总仓库1表"></SheetName>
<SheetName name="岱河矿1表"></SheetName>
<SheetName name="朔里矿1表"></SheetName>
<SheetName name="石台矿1表"></SheetName>
<SheetName name="临涣矿1表"></SheetName>
<SheetName name="海孜矿1表"></SheetName>
<SheetName name="刘店矿1表"></SheetName>
<SheetName name="袁庄矿2表"></SheetName>
<SheetName name="朱庄矿2表"></SheetName>
<SheetName name="杨庄矿2表"></SheetName>
<SheetName name="芦岭矿2表"></SheetName>
<SheetName name="朱仙庄2表"></SheetName>
<SheetName name="童亭矿2表"></SheetName>
<SheetName name="桃园矿2表"></SheetName>
<SheetName name="祁南矿2表"></SheetName>
<SheetName name="许疃矿2表"></SheetName>
<SheetName name="涡北矿2表"></SheetName>
<SheetName name="孙疃矿2表"></SheetName>
<SheetName name="岱河矿2表"></SheetName>
<SheetName name="朔里矿2表"></SheetName>
<SheetName name="石台矿2表"></SheetName>
<SheetName name="临涣矿2表"></SheetName>
<SheetName name="海孜矿2表"></SheetName>
<SheetName name="刘店矿2表"></SheetName>
</SheetNames>
</ReportName>
<ReportName IsSum="false" reg="^\d{2}\w{3}(储备|吨煤)报表.xlsx?$">
<SheetNames>
<SheetName reg="^\d{4}.\d{2}$"></SheetName>
</SheetNames>
</ReportName>
</ReportNames>
<MineNames>
<MineName name="岱河矿"></MineName>
<MineName name="工程处"></MineName>
<MineName name="海孜矿"></MineName>
<MineName name="淮选厂"></MineName>
<MineName name="临涣矿"></MineName>
<MineName name="临选厂"></MineName>
<MineName name="刘店矿"></MineName>
<MineName name="芦岭矿"></MineName>
<MineName name="祁南矿"></MineName>
<MineName name="石台矿"></MineName>
<MineName name="朔里矿"></MineName>
<MineName name="孙疃矿"></MineName>
<MineName name="桃园矿"></MineName>
<MineName name="铁运处"></MineName>
<MineName name="童亭矿"></MineName>
<MineName name="涡北矿"></MineName>
<MineName name="许疃矿"></MineName>
<MineName name="杨庄矿"></MineName>
<MineName name="袁庄矿"></MineName>
<MineName name="朱仙庄"></MineName>
<MineName name="朱庄矿"></MineName>
<MineName name="总仓库"></MineName>
</MineNames>
</ExcelValidate>
只读分析:用File.IsReadOnly判断即可;
命名分析:基于GolbalConfig.xml中的配置进行分析,主要是正则表达式和有效值列表;
格式分析:也是用正则表达式进行分析
Regex excel = new Regex(@"^.xlsx?$");
保护分析:我们知道Excel中的保护功能分为两种级别,一种是工作簿保护,一种是工作表保护,这里要区分对待。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70835.html