C#将table导出到成excel文件

public void printAll(System.Data.DataTable dt)
{

//导出到execl 
try
{
//没有数据的话就不往下执行 
if (dt.Rows.Count == 0)
{ }
//实例化一个Excel.Application对象 
// MessageBox.Show("当前没有数据!");

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

if (excel == null)
{
//MessageBox.Show("无法创建Excel对象,可能未安装Excel");
return;
}

//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错 
excel.Application.Workbooks.Add(true);

//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写 
excel.Visible = false;
//生成Excel中列头名称 
for (int i = 0; i < dt.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dt.Columns[i].ColumnName;//输出DataGridView列头名 
}

//把DataGridView当前页的数据保存在Excel中 
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)//控制Excel中行,上下的距离,就是可以到Excel最下的行数,比数据长了报错,比数据短了会显示不完 
{
for (int j = 0; j < dt.Columns.Count; j++)//控制Excel中列,左右的距离,就是可以到Excel最右的列数,比数据长了报错,比数据短了会显示不完 
{
string str = dt.Rows[i][j].ToString();
excel.Cells[i + 2, j + 1] = "'" + str;//i控制行,从Excel中第2行开始输出第一行数据,j控制列,从Excel中第1列输出第1列数据,"'" +是以string形式保存,所以遇到数字不会转成16进制  
}
}
}
//设置禁止弹出保存和覆盖的询问提示框 
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = false;

//保存工作簿,值为false会报错 
excel.Application.Workbooks.Add(true).Save();
//保存excel文件 
excel.Save("D:" + "\\KKHMD.xls");
//确保Excel进程关闭 
excel.Quit();
excel = null;
}
catch (Exception)
{
//KillProcess("EXCEL");//杀死进程EXCEL 
//int generation = System.GC.GetGeneration(excel);
//excelApp = null;
System.GC.Collect();
//MessageBox.Show(ex.Message, "错误提示"); 
}
}

 

 public static void DataTabletoExcel(System.Data.DataTable tmpDataTable, string strFileName)
    {
        if (tmpDataTable == null)
            return;
        int rowNum = tmpDataTable.Rows.Count;
        int columnNum = tmpDataTable.Columns.Count;
        int rowIndex = 1;
        int columnIndex = 0;
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        xlApp.DefaultFilePath = "";
        xlApp.DisplayAlerts = true;
        xlApp.SheetsInNewWorkbook = 1;
        Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
        //将DataTable的列名导入Excel表第一行
        foreach (DataColumn dc in tmpDataTable.Columns)
        {
            columnIndex++;
            xlApp.Cells[rowIndex, columnIndex] = dc.ColumnName;
        }
        //将DataTable中的数据导入Excel中
        for (int i = 0; i < rowNum; i++)
        {
            rowIndex++;
            columnIndex = 0;
            for (int j = 0; j < columnNum; j++)
            {
                columnIndex++;
                xlApp.Cells[rowIndex, columnIndex] = tmpDataTable.Rows[i][j].ToString();
            }
        }
        //xlBook.SaveCopyAs(HttpUtility.UrlDecode(strFileName, System.Text.Encoding.UTF8));
        string dirname = Path.GetDirectoryName(strFileName);
        if (!Directory.Exists(dirname))
        {
            Directory.CreateDirectory(dirname);
        }
        xlBook.SaveCopyAs(strFileName);
    }


让客户端保存文件代码
 protected void responseHtml(string path)
    {
        FileInfo file = new FileInfo(path);
        string detail = "";
        detail = file.Name + file.Length + file.IsReadOnly + file.FullName + file;
        Response.Clear();
        Response.Charset = "GB2312";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        //   添加头信息,为"文件下载/另存为"对话框指定默认文件名   
        Response.AddHeader("Content-Disposition", "attachment;   filename=" + Server.UrlEncode(file.Name));
        //   添加头信息,指定文件大小,让浏览器能够显示下载进度   
        Response.AddHeader("Content-Length", file.Length.ToString());
        //   指定返回的是一个不能被客户端读取的流,必须被下载   
        //Response.ContentType = "application/ms-excel";
        //   把文件流发送到客户端   
        Response.WriteFile(file.FullName);
        //   停止页面的执行  
        Response.End();
    }

 

 
posted on 2013-04-17 22:47  larryle  阅读(801)  评论(0编辑  收藏  举报