• C#导入导出EXCEL


    摘抄自 http://www.cnblogs.com/daxia/archive/2008/01/08/1030779.html
    供学习之用
    导入导出EXCEL
    #region 导入导出EXCEL
    /**//// <summary>
    /// 将datatable中的数据导出到指定的excel文件中
    /// </summary>
    /// <param name="page">web页面对象</param>
    /// <param name="tab">包含被导出数据的datatable对象</param>
    /// <param name="filename">excel文件的名称</param>
    public static void exportExcel(System.Web.UI.Page page, 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.LightGray;
    datagrid.HeaderStyle.HorizontalAlign
    = HorizontalAlign.Center;
    datagrid.HeaderStyle.Font.Bold
    = true;
    datagrid.DataBind();
    httpresponse.AppendHeader(
    "content-disposition", "attachment;filename=" + HttpUtility.UrlDecode(filename, System.Text.Encoding.UTF8)); //filename="*.xls";
    httpresponse.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
    httpresponse.ContentType
    = "application/ms-excel";
    System.IO.StringWriter tw
    = new StringWriter();
    System.Web.UI.HtmlTextWriter hw
    = new System.Web.UI.HtmlTextWriter(tw);
    datagrid.RenderControl(hw);

    string filepath = page.Server.MapPath("..") + "\\ExcelFolder\\" + filename;
    System.IO.StreamWriter sw
    = System.IO.File.CreateText(filepath);
    sw.Write(tw.ToString());
    sw.Close();

    downfileForExcel(httpresponse, filename, filepath);

    httpresponse.End();
    }
    private static bool downfileForExcel(System.Web.HttpResponse response, string filename, string fullpath)
    {
    try
    {
    response.ContentType
    = "application/octet-stream";

    response.AppendHeader(
    "content-disposition", "attachment;filename=" +
    HttpUtility.UrlDecode(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;
    }
    }

    /**//// <summary>
    /// 将指定Excel文件中的数据转换成DataTable对象,供应用程序进一步处理
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static System.Data.DataTable ImportExcel(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;
    }

    #endregion
  • 相关阅读:
    Row not found or changed. Linq 找不到行或行已更改
    A Session Like ViewState
    WatiN Test Recorder 录制操作的工具
    How to render the  "&nbsp;" in dropdownlist
    My validator 0.1 不支持 ajax 环境
    IDEAL (银行支付接口)如何搞定证书
    Hibernate generator小结
    java 过滤文件
    XML解析
    spark+openfire插件开发(RTX类似的组织架构)
  • 原文地址:https://www.cnblogs.com/BinBinGo/p/2014597.html
Copyright © 2020-2023  润新知