using Excel = Microsoft.Office.Interop.Excel;

private static Excel.Application m_xlApp = null;

/// <summary>  
/// 将DataTable数据导出到Excel表  
/// </summary>  
/// <param name="tmpDataTable">要导出的DataTable</param>
public static void ExportExcel(System.Data.DataTable tmpDataTable) 

    if (tmpDataTable == null) 
    { 
        return; 
    }

long rowNum = tmpDataTable.Rows.Count;//行数  
    int columnNum = tmpDataTable.Columns.Count;//列数  
    Excel.Application m_xlApp = new Excel.Application(); 
    m_xlApp.DisplayAlerts = false;//不显示更改提示  
    m_xlApp.Visible = false;

string saveFileName = "";
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.DefaultExt = "xls";
    saveDialog.Filter = "Excel 文件|*.xls";
    saveDialog.FileName = "Sheet1";
    saveDialog.ShowDialog();
    saveFileName = saveDialog.FileName;
    if (saveFileName.IndexOf(":") < 0)
    {
        return; //被点了取消
    }

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

if (xlApp == null)
      {
             MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
              return;
       }

Excel.Workbooks workbooks = m_xlApp.Workbooks; 
    Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); 
    Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1  
 
    try 
    { 
        if (rowNum > 65536)//单张Excel表格最大行数  
       { 
            long pageRows = 65535;//定义每页显示的行数,行数必须小于65536  
            int scount = (int)(rowNum / pageRows);//导出数据生成的表单数  
           if (scount * pageRows < rowNum)//当总行数不被pageRows整除时,经过四舍五入可能页数不准  
           { 
               scount = scount + 1; 
           } 
           for (int sc = 1; sc <= scount; sc++) 
           { 
                if (sc > 1) 
               { 
                  object missing = System.Reflection.Missing.Value; 
                   worksheet = (Excel.Worksheet)workbook.Worksheets.Add( 
                                missing, missing, missing, missing);//添加一个sheet  
               } 
               else 
               { 
                   worksheet = (Excel.Worksheet)workbook.Worksheets[sc];//取得sheet1  
               } 
                string[,] datas = new string[pageRows + 1, columnNum]; 
 
              for (int i = 0; i < columnNum; i++) //写入字段  
                { 
                    datas[0, i] = tmpDataTable.Columns[i].Caption;//表头信息  
               } 
               Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]); 
               range.Interior.ColorIndex = 15;//15代表灰色  
               range.Font.Bold = true; 
                range.Font.Size = 9;

int init = int.Parse(((sc - 1) * pageRows).ToString()); 
               int r = 0; 
               int index = 0; 
              int result; 
                if (pageRows * sc >= rowNum) 
                { 
                   result = (int)rowNum; 
               } 
               else 
               { 
                   result = int.Parse((pageRows * sc).ToString()); 
               } 
 
               for (r = init; r < result; r++) 
              { 
                   index = index + 1; 
                   for (int i = 0; i < columnNum; i++) 
                  { 
                      object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()]; 
                        datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式  
                    } 
                    System.Windows.Forms.Application.DoEvents(); 
                   //添加进度条  
              }

Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]); 
              fchR.Value2 = datas; 
               worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。  
                m_xlApp.WindowState = Excel.XlWindowState.xlMaximized;//Sheet表最大化  
                range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]); 
                //range.Interior.ColorIndex = 15;//15代表灰色  
               range.Font.Size = 9; 
                range.RowHeight = 14.25; 
                range.Borders.LineStyle = 1; 
               range.HorizontalAlignment = 1; 
           } 
       } 
        else 
       { 
            string[,] datas = new string[rowNum + 1, columnNum]; 
            for (int i = 0; i < columnNum; i++) //写入字段  
          { 
               datas[0, i] = tmpDataTable.Columns[i].Caption; 
           } 
            Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]); 
            range.Interior.ColorIndex = 15;//15代表灰色  
            range.Font.Bold = true; 
            range.Font.Size = 9; 
 
           int r = 0; 
           for (r = 0; r < rowNum; r++) 
           { 
                for (int i = 0; i < columnNum; i++) 
               { 
                    object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()]; 
                    datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式  
               } 
                System.Windows.Forms.Application.DoEvents(); 
               //添加进度条  
           } 
           Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]); 
           fchR.Value2 = datas; 
 
           worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。  
            m_xlApp.WindowState = Excel.XlWindowState.xlMaximized; 
 
           range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]); 
            //range.Interior.ColorIndex = 15;//15代表灰色  
            range.Font.Size = 9; 
            range.RowHeight = 14.25; 
           range.Borders.LineStyle = 1; 
            range.HorizontalAlignment = 1; 
        } 
       workbook.Saved = true;
       workbook.SaveCopyAs(saveFileName);
       if (System.IO.File.Exists(saveFileName))
       {
           System.Diagnostics.Process.Start(saveFileName); //打开EXCE
       }
  } 
    catch (Exception ex) 
    { 
       MessageBox.Show("导出异常:" + ex.Message, "导出异常", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
    } 
    finally 
    { 
       EndReport(); 
   } 

 
 
/// <summary>  
/// 退出报表时关闭Excel和清理垃圾Excel进程  
/// </summary>  
private static void EndReport() 

   object missing = System.Reflection.Missing.Value; 
   try 
   { 
        m_xlApp.Workbooks.Close(); 
        m_xlApp.Workbooks.Application.Quit(); 
      m_xlApp.Application.Quit(); 
       m_xlApp.Quit(); 
   } 
    catch { } 
    finally 
    { 
        try 
      { 
           System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Workbooks); 
           System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Application); 
            System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp); 
            m_xlApp = null; 
       } 
       catch { } 
        try 
        { 
            //清理垃圾进程  
            killProcessThread(); 
       } 
       catch { } 
        GC.Collect(); 
    } 
}

/// <summary>  
/// 杀掉不死进程  
/// </summary>  
private static void killProcessThread() 

   ArrayList myProcess = new ArrayList(); 
   for (int i = 0; i < myProcess.Count; i++) 
   { 
       try 
        { 
           System.Diagnostics.Process.GetProcessById(int.Parse((string)myProcess[i])).Kill(); 
        } 
       catch { } 
   } 
}

/// <summary>
///  从Excel表导入数据
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static DataSet GetPCExcelDataInfo(string path)
 {
            OleDbConnection objConn = null;

try
            {
                // 拼写连接字符串,打开连接
                string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + path + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'";
                objConn = new OleDbConnection(strConn);
                objConn.Open();
                // 取得Excel工作簿中所有工作表
                DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                OleDbDataAdapter sqlada = new OleDbDataAdapter();
                DataSet ds = new DataSet();
                // 遍历工作表取得数据并存入Dataset
                foreach (DataRow dr in schemaTable.Rows)
                {
                    string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
                    OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
                    sqlada.SelectCommand = objCmd;
                    sqlada.Fill(ds, dr[2].ToString().Trim());
                }

return ds;
            }
            catch (Exception ex)
            {
                MessageBox.Show("操作xls文本文件:" + ex.Message);
                return null;
            }
            finally
            {
                objConn.Close();
            }
 }

DataTable数据与Excel表格的相互转换的更多相关文章

  1. 导出数据到Excel表格

    开发工具与关键技术:Visual Studio 和 ASP.NET.MVC,作者:陈鸿鹏撰写时间:2019年5月25日123下面是我们来学习的导出数据到Excel表格的总结首先在视图层写导出数据的点击 ...

  2. Java操作Jxl实现导出数据生成Excel表格数据文件

    实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...

  3. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  4. python 使用openpyxl来写数据到excel表格

    使用openpyxl写execl确实很方便.我先介绍用到的相关模块与函数 Workbook:工作簿模块,在内存创建一个工作簿. ExcelWriter:使用它向exel中写数据. get_column ...

  5. 使用POI实现数据导出Excel表格

    package cn.sh.bzt.kwj.action; import java.io.IOException; import java.io.OutputStream; import java.t ...

  6. 在java中实现数据导入excel表格中

    1.首先前端代码如下: 一个导出按钮:<input id="export" class="btn btn-primary" type="butt ...

  7. PHP批量导出数据为excel表格

    之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...

  8. c#导出ListView中的数据到Excel表格

    1.添加组件:Microsoft.Office.Interop.Excel 步骤:右键点击“引用”--->添加引用--->COM--->Microsoft.Office.Intero ...

  9. (原创)将Datatable数据按照Excel模板格式导出

    最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...

随机推荐

  1. Mvc 页面缓存 OutputCache VaryByCustom

    优化网站,dotNet MVC 可以通过(OutputCache)特性在某些Action上使用缓存,如果我们想要自定义缓存依据可以通过如下方式进行: 第一步, 在 global.asax.cs 文件中 ...

  2. 转:Github上最受关注的前端大牛,快来膜拜吧!

    原文来自于:http://code.csdn.net/news/2820990 本文列出了Github上最受关注的10位前端大牛.看看他们负责的项目和提交的代码,你是不是能从中学到些什么? 1. Pa ...

  3. Javascript 注意点

    prototype有助于减少function的冲突. 闭包有助于避免全部变量. this, prototype有助于实例化多个对象. 函数 函数表达式

  4. Django 1.6 的测试驱动开发

    http://www.oschina.net/translate/django-1-6-test-driven-development 测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前 ...

  5. C++ Primer 随笔 Chapter 13 复制控制

    1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...

  6. cgic: CGI的C函数库

    下载回源码包以后,就3个文件:cgic.c      函数库capture.c   一个很简单的CGI例子,仅仅输出两行提示文字cgictest.c  一个演示读取form表单数据的CGI例子 首先在 ...

  7. SQL中的NULL值

    除is [not] null之外,空值不满足任何查找条件.–如果null参与算术运算,则该算术表达式的值为null.–如果null参与比较运算,则结果可视为false.在SQL-92中可看成unkno ...

  8. 滑雪 (搜索)(dp)(贪心)

    以每一点为起点找出所有路径,并求出以此点做为起点的最大路径 求出每个点的最大路径后再找出其中最大的值,输出最大值 #include <stdio.h>#include <string ...

  9. Codeforces Round #324 (Div. 2)解题报告

    ---恢复内容开始--- Codeforces Round #324 (Div. 2) Problem A 题目大意:给二个数n.t,求一个n位数能够被t整除,存在多组解时输出任意一组,不存在时输出“ ...

  10. 编写Lex和Yacc

    大学课程设计中,有一次是编写Lex(词法分析器的生成器)和Yacc(语法分析器的生成器),编写这类工具软件不是一件容易的事情.这篇文章记录了当时编程时候的主要思想,主要还是编译原理的思想. 准备 Le ...