Edi Wang

.NET and Azure Developer

.NET C# Programming Language and .NET Platform

Read Excel 2010 via C#

昨天一个同学让我帮忙写个小工具,读一个Excel,只读B列的内容。我拿C#写了一个.NET4的winform程序。虽然简单,但有很多可圈可点的地方,因此撰写本文以警后人。 那个Excel是2010格式的,所以我们先要安装AccessDatabaseEngine,下载地址如下: http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe 这样程序读取Excel的时候就不会抛出OleDb驱动未注册的异常了。 我们先看看Excel文件,格式很简单: 我们需要读的,是B列除标题以外的内容。即B2到B6的内容,观察到它是字符串,所以程序里要作为string读取。 程序界面设计如下,点击ReadExcel后,会将B列的内容显示到listBox1里: …
C# DataTable Excel

ASP.NET中使用Razor导致自定义Membership失效的解决办法

最近在研究Razor和MVC,打算逐步把博客用Razor重写一边。今天一上手就碰到个蛋碎的问题。不管是在MVC应用程序,还是传统的WebForm项目中添加Razor页(既.cshtml类型的页面),就会导致自定义的Membership Provider失效。如果去掉Membership的配置则一切正常。 具体问题表现在有两个地方报错: 1. 运行时报错:Parser Error Message: Default Membership Provider could not be found. 2. 编译时报错:Error    58    The pre-application start initialization method Start on type System.Web.WebPages.Deployment.PreApplicationStartCode threw an …
Membership Razor Web.Config

JQuery文本框自动完成,通过AJAX调用ASP.NET WebService

最近在搞博客搜索框的自动完成功能,用的是JQuery UI里的autocomplete插件。插件的数据源是用AJAX调用一个WebService,网站后台有个标签库,WebService返回的是符合条件的标签。最终效果如下: 我们先来看WebService的代码,方法很简单: [WebMethod] public List GetAllTagsForAutoComplete(string tagName) { return optTag.GetModelList().Where(p => p.Name.ToLower().StartsWith(tagName.ToLower())).ToList(); }  这个方法的作用是根据输入的内容,检索所有以tagName开头的标签。我没有返回全部标签,是因为autocomplete插件的默认行为不符合我的需求。在默认情况下,如果我输入 …
AJAX ASP.NET AutoComplete jQuery WebService

JQuery AJAX读取ASP.NET WebService泛型方法

这几天在研究JQuery和WebService,被泛型返回类型搞死了。查了很多资料做实验终于搞定了。网上很多垃圾文章的作者都不亲手实验就到处拼凑把东西发上来,太不负责了。下面我发的是100%可用的,经过亲手实验的代码。 首先在WebService上要注意一点,一定记得把[System.Web.Script.Services.ScriptService]这行取消注释,这样脚本才可以调用到WebService。如图: 我用来测试的是我网站的友情链接列表,其WebService方法如下: [WebMethod] public List GetFriendLinks() { return new EdiBlog.Core.FriendLink().GetModelList(); } 经过测试,在浏览器中用GET访问是会爆掉的,所以我们用POST方法去调用。在默认的IIS和ASP. …
AJAX ASP.NET jQuery WebService

ASP.NET中使用Response方式下载文件

今天在修改我博客的文件管理功能,尝试解决一直以来的一个问题。即IIS中没有注册MIME映射的文件类型,是无法直接用Http Get方式下载的,也就是不能点击超链接直接转向文件位置。比如7z压缩包,如果直接下载,会是这个样子: 后来我想到了以前Gridview输出Excel的方式,是通过Response传输字节流的。稍微查阅了一下,发现ASP.NET的Response对象现在有了一个新的方法:TransmitFile(),不过它在MSDN上的描述不是很详细。 具体做法是这样的: Response.ContentType = "application/x-compress"; Response.AddHeader("Content-Disposition", string.Format("attachment;filename=要输出的文件名")); Response. …
ASP.NET

C#读取Excel单元格中的日期

今天写一小程序用来分析某Excel报表,结果在处理日期的时候蛋疼了。 原Excel是这样的: Excel加载到DataTable以后,日期都变成了这个样子: 看起来很像某偏移量。当然也有一部分日期是正常的: 我尝试用DateTime.Parse直接匹配,结果爆掉了。于是查了下MSDN找到了正确的办法:DateTime.FromOADate(double d) 方法: d 参数是一个双精度浮点数字,它将日期表示为基础日期(1899 年 12 月 30 日午夜)之前或之后的天数。 d 的符号和整数部分将日期编码为相对于 1899 年 12 月 30 日的正负日偏移量,而 d 的小数部分的绝对值将当天的时间编码为相对于午夜的小数日偏移量。d 必须为负 657435.0 到正 2958466.0 之间的值。 根据我的Excel,我封装了一下转换函数,如下: private DateTime …
DateTime Excel

ASP.NET制作基于的XML导航栏

首先说明,本文为照顾刚入门的新手,有些地方可能会稍微说点基础的东西,高手可以直接忽略。 场景:以前做网站的时候,导航栏的链接都是写死在页面中的,这样不易与维护。于是今天写成了用XML配置的导航栏。用到了LINQ to XML。 先介绍一下功能: 储存导航栏信息的XML文件如下: Title是显示名称,Link是URL,OrderId表示排序的序位,Enabled为是否启用。这个菜单将最终被解析为一个ul列表: Shitter Shit Shitting Shitfully 然后我们来看看如何实现: 首先需要给菜单创建一个只包含属性的模型类,它的作用是成为对具体某一个菜单项的描述,系统中传递的将是这样一个模型: public class MenuItem { …
ASP.NET XML

ASP.NET:如何把ashx写到类库里并在页面上调用

最近在调整博客的架构,进一步把表现和业务分离,所以要把之前用ashx搞的那些Http Handler放到类库中。在类库中建Http Handler的操作很简单,就是添加一个普通的类,然后把之前ashx里的代码几乎一模一样贴到这个类中。但要注意命名空间和类名,因为之后我们会用到。 样例Handler: namespace EdiBlog.Core.Web.HttpHandlers { using System; using System.Web; public class ExampleHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void …
ASP.NET

ASP.NET中处理路径的问题

关于相对路径和绝对路径 相对路径转绝对路径 一般,我们在ASP.NET网站中往往需要把一个相对路径转化为绝对路径。通常是用Server.MapPath()方法。比如网站根目录下有个"Uploads"文件夹,那么我们调用Server.MapPath("Uploads")就会返回这个文件夹在服务器上的绝对路径,比如D:\Web1\Uploads。 另一种方法是使用HttpRuntime.AppDomainAppPath,它读取的就是当前网站的运行目录。 关于波浪线: 如果在路径前加上波浪线“~”则表示从网站根目录出发的相对路径。这在引用图片、CSS的时候比较常用。比如“~\Images”。并且这个路径同样可以传给Server.MapPath()用来返回绝对路径。 总是从网站跟目录出发: 在某些场合下,比如网站使用了URL重写组件 …
ASP.NET

LINQ重写博客垃圾图片回收算法

本人博客后台管理模块有个功能,可以扫描图片上传文件夹下所有未被引用的博客。思路很简单,从所有Blog Model中解析出所有文章使用的图片文件名,排除站外引用,放入一个List usedPicList。再遍历图片上传文件夹,把所有图片文件的结果加入FileInfo[] fiAllPicList。然后比较usedPicList和fiAllPicList,找出所有fiAllPicList中有,而usedPicList中木有的图片,就是未被任何文章引用的垃圾图片了。 原先这个比较算法是用传统方法写的,很蛋疼,用了两重循环,一个标志位才解决问题: List garbagePicList = new List(); for (int k = 0; k 今天用LINQ重写了一下: List garbagePicList = new List(); var query = …
C# Algorithm Refactor