1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Web;
5
using System.Web.Security;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.Web.UI.WebControls.WebParts;
9
using System.Web.UI.HtmlControls;
10
using System.IO;
11
using System.Reflection;
12
using System.Runtime.InteropServices;
13
14
15
这位兄弟遇到的问题是读取出来的数据如果一列中既有数字又有字符读取结果会统一按照数字对待或按照字符对待,错误格式化为与原Excel不相同的数据。于是他强制编码啊,设定文化啊什么的折腾了一下午也没有变化,遂来问我,告诉他解决方法后该兄弟很吃惊兼郁闷,愤愤不平为什么有这样的参数。因为我改的地方只有一处:2
3
4
5
6
7
8
9
10
11
12
13
14
15
将连接字符串的Extended Properties=\"Excel 8.0;HDR=1\"改为Extended Properties=\"Excel 8.0;HDR=1;IMEX=1\",指定IMEX=1将所有读入数据看作字符,否则出现数字/汉字同列不相容等现象,正如指定HDR=yes或no可以选择第一列是否当标题看待一样。可惜HDR的指定网络上说明较多而IMEX的说明网上较少。下面是将Excel读入DataTable的修改后代码:
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Web;
5
using System.Web.Security;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.Web.UI.WebControls.WebParts;
9
using System.Web.UI.HtmlControls;
10
using System.IO;
11
using System.Reflection;
12
using System.Runtime.InteropServices;
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
其实这并不是一个好设计,就像结构化异常处理出来之前用错误号返回错误一样,需要什么查询说明甚至猜测尝试来得到解决之道,除了能让知道的人沾沾自喜、成为不知者的编程障碍外没有多大作用。应该在设计方法时需要避免这种情况发生,以有意义的参数或明确的参数说明帮助使用者在最短时间内掌握正确的方法使用之道。
Excel导到DataTable,问题本身很简单,但折射出很多需要思考的东西。编码层级的设计模式并不能解决所有的问题,我们写每个方法的时候,可曾细细考虑过自己的方法在别人复用时有无人为的障碍?如何才能减少自己的方法、模块、程序集复用的人为障碍?