zoukankan      html  css  js  c++  java
  • C#对excel的操作

    本文先描述如何用c#连接、操作excel文件。

    项目中需要引入的DLL文件为Interop.Excel、Interop.Microsoft.Office.Core、Interop.Office等。

    操作excel前需要定义一些excel变量:

    定义操作excel的公共变量[www.cn-web.com]

    public Excel.Application m_objExcel = null;//Excel的工作环境

    public Excel._Workbook m_objBook = null;//工作簿对象

    public Excel.Sheets m_objsheets = null;//工作表集合

    public Excel._Worksheet m_objSheet = null;//活动工作表

    public Excel.Range m_objRange = null;//选择单元格

    连接excel文件并选择要操作的表[www.cn-web.com]

    string excelfilename="cn-web-com/1.xls";

    excelfilename=Server.MapPath(excelfilename);//取得excel文件的地址

    m_objExcel = new Excel.Application();

    m_objBook = m_objExcel.Workbooks.Open(excelfilename, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);

    m_objsheets=m_objBook.Worksheets;

    m_objSheet=(_Worksheet)m_objsheets.get_Item(1);//选择的是第一个表

    经过以上操作,我们可以连接上了excel并获取excel里第一张表的对象:m_objSheet。

    连接上后,我们向excel表里写入数据:

    向excel某单元格内写入数据[www.cn-web.com]

    string pos="A1";//excel中A1的位置。

    m_objRange = m_objSheet.get_Range(_pos, m_objOpt);//取得单元格

    m_objRange.Value2 = "技术支持:cn-web.com(老韩)";//向A1单元格中写入数据

    接着,我们将此excel另存:

    保存excel文档[www.cn-web.com]

    m_objBook.SaveAs(savefileurl, oP.m_objOpt, oP.m_objOpt, oP.m_objOpt, oP.m_objOpt, oP.m_objOpt, Excel.XlSaveAsAccessMode.xlShared, oP.m_objOpt, oP.m_objOpt, oP.m_objOpt, oP.m_objOpt);//savefileurl为物理地址

    最后,要记着关闭excel进程:

    关闭excel操作进程[www.cn-web.com]

    m_objBook.Close(m_objOpt, m_objOpt, m_objOpt);

    m_objExcel.Workbooks.Close();

    m_objExcel.Quit();

    System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);

    System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);

    m_objBook = null;

    m_objExcel = null;

    GC.Collect();

    foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())

    {

    if (p.ProcessName.ToUpper() == "EXCEL")

    {

    p.Kill();

    }

    }

    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;

    }

    转载请注明文章来自:程序猴(http://www.chengxuhou.com/)
  • 相关阅读:
    领域驱动设计学习笔记(一 事件总线)
    枚举位预算 (适用于权限和拥有多种枚举值)
    Javascript闭包(狗血剧情,通俗易懂)
    Xml序列化和反序列化
    Javascript轮播 支持平滑和渐隐两种效果(可以只有两张图)
    Git使用教程
    MySQL数据库基本用法-聚合-分组
    MySQL数据库基本用法-查询
    MySQL数据库基本用法
    JS中获取文件点之后的后缀字符
  • 原文地址:https://www.cnblogs.com/minotmin/p/3251168.html
Copyright © 2011-2022 走看看