zoukankan      html  css  js  c++  java
  • Asp.Net下导出/导入规则的Excel(.xls)文档

    datatable中的数据导出excel文档
    /// <summary>
    /// 将datatable中的数据导出到指定的excel文档中
    /// </summary>
    /// <param name="page">web页面对象</param>
    /// <param name="tab">包含被导出数据的datatable对象</param>
    /// <param name="filename">excel文档的名称</param>
    public static void export(system.web.ui.page page,system.data.datatable tab,string filename)
    {
    system.web.httpresponse httpresponse = page.response;
    system.web.ui.webcontrols.datagrid datagrid=new system.web.ui.webcontrols.datagrid();
    datagrid.datasource=tab.defaultview;
    datagrid.allowpaging = false;
    datagrid.headerstyle.backcolor = system.drawing.color.green;
    datagrid.headerstyle.horizontalalign = horizontalalign.center;
    datagrid.headerstyle.font.bold = true;
    datagrid.databind();
    httpresponse.appendheader("content-disposition","attachment;filename="+httputility.urlencode(filename,system.text.encoding.utf8)); //filename="*.xls";
    httpresponse.contentencoding=system.text.encoding.getencoding("gb2312");
    httpresponse.contenttype ="application/ms-excel";
    system.io.stringwriter tw = new system.io.stringwriter() ;
    system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
    datagrid.rendercontrol(hw);

    string filepath = page.server.mappath("..")+"\\files\\" +filename;
    system.io.streamwriter sw = system.io.file.createtext(filepath);
    sw.write(tw.tostring());
    sw.close();

    downfile(httpresponse,filename,filepath);

    httpresponse.end();
    }
    private static bool downfile(system.web.httpresponse response,string filename,string fullpath)
    {
    try
    {
    response.contenttype = "application/octet-stream";

    response.appendheader("content-disposition","attachment;filename=" +
    httputility.urlencode(filename,system.text.encoding.utf8) + ";charset=gb2312");
    system.io.filestream fs= system.io.file.openread(fullpath);
    long flen=fs.length;
    int size=102400;//每100k同时下载数据
    byte[] readdata = new byte[size];//指定缓冲区的大小
    if(size>flen)size=convert.toint32(flen);
    long fpos=0;
    bool isend=false;
    while (!isend)
    {
    if((fpos+size)>flen)
    {
    size=convert.toint32(flen-fpos);
    readdata = new byte[size];
    isend=true;
    }
    fs.read(readdata, 0, size);//读入一个压缩块
    response.binarywrite(readdata);
    fpos+=size;
    }
    fs.close();
    system.io.file.delete(fullpath);
    return true;
    }
    catch
    {
    return false;
    }
    }

    将指定excel文档中的数据转换成datatable
    /// <summary>
    /// 将指定excel文档中的数据转换成datatable对象,供给用程式进一步处理
    /// </summary>
    /// <param name="filepath"></param>
    /// <returns></returns>
    public static system.data.datatable import(string filepath)
    {
    system.data.datatable rs = new system.data.datatable();
    bool canopen=false;

    oledbconnection conn = new oledbconnection("provider=microsoft.jet.oledb.4.0;"+
    "data source=" + filepath + ";" +
    "extended properties=\"excel 8.0;\"");

    try//尝试数据连接是否可用
    {
    conn.open();
    conn.close();
    canopen=true;
    }
    catch{}

    if(canopen)
    {
    try//假如数据连接能够打开则尝试读入数据
    {
    oledbcommand myoledbcommand = new oledbcommand("select * from [sheet1$]",conn);
    oledbdataadapter mydata = new oledbdataadapter(myoledbcommand);
    mydata.fill(rs);
    conn.close();
    }
    catch//假如数据连接能够打开但是读入数据失败,则从文档中提取出工作表的名称,再读入数据
    {
    string sheetname=getsheetname(filepath);
    if(sheetname.length>0)
    {
    oledbcommand myoledbcommand = new oledbcommand("select * from ["+sheetname+"$]",conn);
    oledbdataadapter mydata = new oledbdataadapter(myoledbcommand);
    mydata.fill(rs);
    conn.close();
    }
    }
    }
    else
    {
    system.io.streamreader tmpstream=file.opentext(filepath);
    string tmpstr=tmpstream.readtoend();
    tmpstream.close();
    rs=getdatatablefromstring(tmpstr);
    tmpstr="";
    }
    return rs;
    }
    /// <summary>
    /// 将指定html字符串的数据转换成datatable对象 --根据“<tr><td>”等特别字符进行处理
    /// </summary>
    /// <param name="tmphtml">html字符串</param>
    /// <returns></returns>
    private static datatable getdatatablefromstring(string tmphtml)
    {
    string tmpstr=tmphtml;
    datatable tb=new datatable();
    //先处理一下这个字符串,删除第一个<tr>之前合最后一个</tr>之后的部分
    int index=tmpstr.indexof("<tr");
    if(index>-1)
    tmpstr=tmpstr.substring(index);
    else
    return tb;

    index=tmpstr.lastindexof("</tr>");
    if(index>-1)
    tmpstr=tmpstr.substring(0,index+5);
    else
    return tb;

    bool existssparator=false;
    char separator=convert.tochar("^");

    //假如原字符串中包含分隔符“^”则先把他替换掉
    if(tmpstr.indexof(separator.tostring())>-1)
    {
    existssparator=true;
    tmpstr=tmpstr.replace("^","^$&^");
    }

    //先根据“</tr>”分拆
    string[] tmprow=tmpstr.replace("</tr>","^").split(separator);

    for(int i=0;i<tmprow.length-1;i++)
    {
    datarow newrow=tb.newrow();

    string tmpstri=tmprow[i];
    if(tmpstri.indexof("<tr")>-1)
    {
    tmpstri=tmpstri.substring(tmpstri.indexof("<tr"));
    if(tmpstri.indexof("display:none")<0||tmpstri.indexof("display:none")>tmpstri.indexof(">"))
    {
    tmpstri=tmpstri.replace("</td>","^");
    string[] tmpfield=tmpstri.split(separator);

    for(int j=0;j<tmpfield.length-1;j++)
    {
    tmpfield[j]=removestring(tmpfield[j],"<font>");
    index=tmpfield[j].lastindexof(">")+1;
    if(index>0)
    {
    string field=tmpfield[j].substring(index,tmpfield[j].length-index);
    if(existssparator) field=field.replace("^$&^","^");
    if(i==0)
    {
    string tmpfieldname=field;
    int sn=1;
    while(tb.columns.contains(tmpfieldname))
    {
    tmpfieldname=field+sn.tostring();
    sn+=1;
    }
    tb.columns.add(tmpfieldname);
    }
    else
    {
    newrow[j]=field;
    }
    }//end of if(index>0)
    }

    if(i>0)
    tb.rows.add(newrow);
    }
    }
    }

    tb.acceptchanges();
    return tb;
    }

    /// <summary>
    /// 从指定html字符串中剔除指定的对象
    /// </summary>
    /// <param name="tmphtml">html字符串</param>
    /// <param name="remove">需要剔除的对象--例如输入"<font>"则剔除"<font ???????>"和"</font>>"</param>
    /// <returns></returns>
    public static string removestring(string tmphtml,string remove)
    {
    tmphtml=tmphtml.replace(remove.replace("<","</"),"");
    tmphtml=removestringhead(tmphtml,remove);
    return tmphtml;
    }
    /// <summary>
    /// 只供方法removestring()使用
    /// </summary>
    /// <returns></returns>
    private static string removestringhead(string tmphtml,string remove)
    {
    //为了方便注释,假设输入参数remove="<font>"
    if(remove.length<1) return tmphtml;//参数remove为空:不处理返回
    if((remove.substring(0,1)!="<")||(remove.substring(remove.length-1)!=">")) return tmphtml;//参数remove不是<?????>:不处理返回

    int indexs=tmphtml.indexof(remove.replace(">",""));//查找“<font”的位置
    int indexe=-1;
    if(indexs>-1)
    {
    string tmpright=tmphtml.substring(indexs,tmphtml.length-indexs);
    indexe=tmpright.indexof(">");
    if(indexe>-1)
    tmphtml=tmphtml.substring(0,indexs)+tmphtml.substring(indexs+indexe+1);
    if(tmphtml.indexof(remove.replace(">",""))>-1)
    tmphtml=removestringhead(tmphtml,remove);
    }
    return tmphtml;
    }

    /// <summary>
    /// 将指定excel文档中读取第一张工作表的名称
    /// </summary>
    /// <param name="filepath"></param>
    /// <returns></returns>
    private static string getsheetname(string filepath)
    {
    string sheetname="";

    system.io.filestream tmpstream=file.openread(filepath);
    byte[] filebyte=new byte[tmpstream.length];
    tmpstream.read(filebyte,0,filebyte.length);
    tmpstream.close();

    byte[] tmpbyte=new byte[]{convert.tobyte(11),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),
    convert.tobyte(11),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),convert.tobyte(0),
    convert.tobyte(30),convert.tobyte(16),convert.tobyte(0),convert.tobyte(0)};

    int index=getsheetindex(filebyte,tmpbyte);
    if(index>-1)
    {

    index+=16+12;
    system.collections.arraylist sheetnamelist=new system.collections.arraylist();

    for(int i=index;i<filebyte.length-1;i++)
    {
    byte temp=filebyte[i];
    if(temp!=convert.tobyte(0))
    sheetnamelist.add(temp);
    else
    break;
    }
    byte[] sheetnamebyte=new byte[sheetnamelist.count];
    for(int i=0;i<sheetnamelist.count;i++)
    sheetnamebyte[i]=convert.tobyte(sheetnamelist[i]);

    sheetname=system.text.encoding.default.getstring(sheetnamebyte);
    }
    return sheetname;
    }
    /// <summary>
    /// 只供方法getsheetname()使用
    /// </summary>
    /// <returns></returns>
    private static int getsheetindex(byte[] findtarget,byte[] finditem)
    {
    int index=-1;

    int finditemlength=finditem.length;
    if(finditemlength<1) return -1;
    int findtargetlength=findtarget.length;
    if((findtargetlength-1)<finditemlength) return -1;

    for(int i=findtargetlength-finditemlength-1;i>-1;i--)
    {
    system.collections.arraylist tmplist=new system.collections.arraylist();
    int find=0;
    for(int j=0;j<finditemlength;j++)
    {
    if(findtarget[i+j]==finditem[j]) find+=1;
    }
    if(find==finditemlength)
    {
    index=i;
    break;
    }
    }
    return index;
    }
  • 相关阅读:
    注意力机制的命名实体识别
    tfidf_CountVectorizer 与 TfidfTransformer 保存和测试
    转载:UML学习(三)-----序列图(silent)
    转载:UML学习(二)-----类图(silent)
    转载:UML学习(一)-----用例图 (silent)
    转载:Practical UML™: A Hands-On Introduction for Developers
    转载:gc的概念,如果A和B对象循环引用,是否可以被GC?
    转载:Java高并发,如何解决,什么方式解决
    转载:消息队列应用场景
    转载:详解Java 自动装箱与拆箱的实现原理
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/1231333.html
Copyright © 2011-2022 走看看