• DataTable数据与Excel表格的相互转换


    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();
                }
     }

  • 相关阅读:
    [POJ1743]Musical Theme
    ubuntu qq
    Separate code and data contexts: an architectural approach to virtual text sharing
    Python3发送post请求,自动记住cookie
    python 异步协程
    豆瓣爬虫
    pandas 使用
    房天下爬虫
    计算英文文章词频的两种方法
    LOW版统计词频
  • 原文地址:https://www.cnblogs.com/jdk123456/p/3520646.html
Copyright © 2020-2023  润新知