ppchen(陈荣林)

。。。。。年轻没有什么不可以
posts - 6, comments - 29, trackbacks - 2, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年3月21日

    发布一个最近完成的Excel2007操作类库,可以在没有安装Office的机器上快速读写和操作Excel2007格式文件,不过还是需要.net framework2.0  :)。生成效率比较高,写入10000行50列的数据只需12秒,如果数据是纯数字还会更快,我的机器Pentium M 1.8G CPU 1.25G Memory。

    Office2007中的Excel,Word,PowedPoint使用了OpenXml文件格式,文件是一个标准的zip压缩包,只需要简单的将文件的扩展名更改为.zip,就能看到其内部的具体内容,大部分是标准的xml文件,所以类库主要的任务就是操作xml。Excel2007的操作类库目前已经有人写过了如:ExcelPackage,最初因为项目需要也曾经改造过改类库,试图将之封装成可以结合报表数据分析工具的Excel2007报表生成工具,但是ExcelPackage内部的操作全部基于XmlDocument,效率低,生成简单的报表还可以,数据量稍微有点大就处理不过来了。

    开始研究怎么样才能提高效率的时候,思索了一阵子,基于XmlDocument的操作,涉及了XPath等操作都是基于文档的,许多XPath的查询都是需要遍历文档的,即使再怎么优化XPath也不能提高太多的效率。后面老大提醒了我,应该把所有XML的操作都放到内存当中去做,把Excel文件中的XML文档内容映射到内存中的自定义对象,在操作完成后再将内存中的对象写回zip压缩包中去。没错就是这个思路...

    编写这个类库的时候使用了System.IO.Packaging这个名称空间,该空间内提供了一些对zip文件的操作类,该空间位于WindowsBase.dll中,是一个.net3.x的库,其实还有一个可以实现和System.IO.Pacakaging类似功能的类库SharpZipLib,只是之前在编写Excel2007操作类库的时候还不知道,暂且从已经安装了.net3.x的同事那拷贝了WindwsBase.dll过来用,还好能顺利的在VS2005中引用且能正常使用。

    此类库目前已经结合一个报表数据分析引擎,在一个中型Web系统中实现Excel2007报表的功能。
 

下载:
Excel.OpenXml

如果你现在使用旧版office的话,可点这里下载格式转换工具,让你的office也支持OOXML。

posted @ 2008-03-21 23:10 ppchen(陈荣林) 阅读(3175) | 评论 (29)编辑

2008年3月18日

    Assembly发布时可以使用Debug或Release方式,关于Debug和Release的比较园子里已经有很多了,毫无疑问,Debug版本包含Debug信息,只是在开发的时候带来调试的方便,编译器并不对其中的代码进行优化处理,而Release版本无论是在效率或是稳定性上都要高于Debug版本。所以在部署时最好是要确认一下是否使用了Release版本。

    AssemblyCheckTool是一个用于读取检查.NET程序或程序集编译状态的小工具,其原理是通过反射读取Assembly信息,并判断DebuggableAttribute属性值来完成的,核心部分代码如下:
/// <summary>
/// 判断是否为Debug模式
/// Author:ppchen
/// </summary>
private static bool IsAssemblyDebugBuild(string filepath)
{
    
return IsAssemblyDebugBuild(Assembly.LoadFile(Path.GetFullPath(filepath)));
}

private static bool IsAssemblyDebugBuild(Assembly asm)
{
    
object[] objs = asm.GetCustomAttributes(typeof(System.Diagnostics.DebuggableAttribute), true);
    
if (objs.Length > 0)
    {
        DebuggableAttribute debugAtt 
= objs[0as DebuggableAttribute;
        
if (debugAtt != null)
        {
            
return debugAtt.IsJITTrackingEnabled;
        }
    }
    
return false;
}

上一个程序的截图:


程序下载:
AssemblyCheckTool

posted @ 2008-03-18 21:12 ppchen(陈荣林) 阅读(153) | 评论 (0)编辑

    做Web开发时经常涉及到页面之间的转跳,页面之间的转跳就会涉及到页面之间参数的传递,通过URL传递参数是常用的方法之一,但是微软说:"Maximum URL length is 2,083 characters in Internet Explorer",也就是说URL是有长度限制的。

    ASP.NET应用程序前台与后台的数据交换都是通过FORM表单来完成的,FORM表单提供了两种数据传输方式:GET和POST,这个两种数据传输方式在实际传输中有很大的不同,但ASP.NET框架中已经屏蔽了二者的一些差异。GET是用来从服务器上获得数据,而POST是用来向服务器提交数据的。二者数据传输过程中分别对应了HTTP协议中的GET和POST方法。

    GET方式是把参数数据队列加到提交表单的ACTION属性所指的URL后面,并且使用"?"隔开,值和表单内各个字段一一对应,在URL中可以看到,它是FROM默认的提交方式,受URL长度的限制,它所能传递的数据量小。
    POST方式是把表单中的数据放在FORM载体中,按照变量和值相对应的方式,传递到ACTION所指向URL,POST可以传递大数据量的信息到服务器,通常文件上传就是使用POST方式上传。

    为解决GET方式传递大数据量参数的问题,要使用POST方式进行数据提交,下面是一个用来代替window.open的方法
1.JavaScript
/*
 * PostNewWin
 * Author:ppchen
 
*/
var PostNewWin = function(url){
    
var urlArr = url.split("?");
    
var postUrl = urlArr[0];
    
var postData = urlArr[1];
    
var iframe = document.getElementById("postData_iframe");
    
if(!iframe){
        iframe 
= document.createElement("iframe");
        iframe.id 
= "postData_iframe";
        iframe.scr
= "about:blank";
        iframe.frameborder 
= "0";
        iframe.style.width 
= "0px";
        iframe.style.height 
= "0px";
        
        
var form = document.createElement("form");
        form.id 
= "postData_form";
        form.method 
= "post";
        form.target 
= "_blank";
        
        document.body.appendChild(iframe);
        iframe.contentWindow.document.write(
"<body>" + form.outerHTML + "</body>");
    }
    iframe.contentWindow.document.getElementById(
"postData_form").innerHTML = "<input name='postData' id='postData' type='text' value='" + postData + "'/>";
    iframe.contentWindow.document.getElementById(
"postData_form").action = postUrl;
    iframe.contentWindow.document.getElementById(
"postData_form").submit();
};
 
2.CSharp
/// <summary>
/// 从Form中取得参数
/// Author:ppchen
/// </summary>
/// <returns>参数集合</returns>
private NameValueCollection ParseFormData()
{
    NameValueCollection sQueryString 
= new NameValueCollection();
    
if (this.Request.Form.Count > 0 && this.Request.Form["postData"!= null)
    {
        
string sPostData = this.Request.Form["postData"].ToString();
        sPostData 
= sPostData.Trim(new char[] { '&'' ' });
        
if (!string.IsNullOrEmpty(sPostData))
        {
            
string[] sParameterList = sPostData.Split('&');
            
for (int i = 0; i < sParameterList.Length; i++)
            {
                
string[] sParameter = sParameterList[i].Split('=');
                
for (int j = 0; j < sParameter.Length; j = j + 2)
                {
                    sQueryString.Add(sParameter[j], HttpUtility.UrlDecode(sParameter[j 
+ 1]));
                }
            }
        }
    }
    
return sQueryString;
}

通过以上的JS代码在客户端打开页面,通过以上的CS代码在服务端取得参数,这样使用了POST方式解决了GET方式中URL的长度限制,可以传递大数据量的参数了:)


测试代码下载:
PostNewWin

posted @ 2008-03-18 14:05 ppchen(陈荣林) 阅读(465) | 评论 (2)编辑

2007年6月28日

好久没看到这样的天气了,记录一下。

posted @ 2007-06-28 12:49 ppchen(陈荣林) 阅读(28) | 评论 (0)编辑