zoukankan      html  css  js  c++  java
  • C# 导出Excel


    using System;
    using System.IO;
    using Excel;


    namespace Kits.Excel
    {
        public class ExcelTools
        {
            /// <summary>
      /// 导出到EXCEL表
      /// </summary>
            private static void toExcel(string FileName, string SheetName, System.Data.DataTable dt)
      {
       ApplicationClass myExcel = new ApplicationClass();
       Worksheet worksheet = null;

       string curPath = Directory.GetParent(FileName).FullName;
       if(!Directory.Exists(curPath))
       {
        Directory.CreateDirectory(curPath);
       }

       if (File.Exists(FileName))
       {
        try
        {
         File.Delete(FileName);
        }
        catch
        {
         throw new Exception("文件操作出错,可能正在运行当前的EXCEL文件!");
        }
       }

       try
       {
        object missing = System.Reflection.Missing.Value;

        myExcel.Workbooks.Add(missing);
        worksheet = (Worksheet)myExcel.ActiveSheet;
        worksheet.Name = SheetName;
        myExcel.Visible = false;
        

        int iRows = dt.Rows.Count;
        int iCol = dt.Columns.Count;

        worksheet.get_Range( worksheet.Cells[1, 1], worksheet.Cells[ iRows+1, iCol] ).NumberFormatLocal = "@";

        for( int i=0; i<iCol; i++)
        {
         worksheet.Cells[1,i+1] = dt.Columns[i].ToString();
        }

        int size = iRows / 1000;
        int page = 0;
        string[,] rows = null;
        for(int i=0; i<iRows; )
        {    
         if(page<size)
         {
          rows = new string[1000,iCol];
          for(int count=0;count<1000;count++)
          {
           for(int j=0; j<iCol; j++)
           {
            rows[count,j] = dt.DefaultView[i][j].ToString();
           }
           i++;
          }
          worksheet.get_Range(worksheet.Cells[page * 1000 + 2, 1], worksheet.Cells[ page * 1000 + 1001, iCol]).Value2 = rows;
          page++;
         }
         else
         {
          int left = iRows % 1000;
          rows = new string[left,iCol];
          for(int count=0;count<left;count++)
          {
           for(int j=0; j<iCol; j++)
           {
            rows[count,j] = dt.DefaultView[i][j].ToString();
           }
           i++;
          }
          worksheet.get_Range(worksheet.Cells[iRows+2-left, 1], worksheet.Cells[ iRows+1, iCol]).Value2 = rows;
         }
        }
        
        worksheet.SaveAs( FileName, missing, missing, missing, missing, missing, missing, missing, missing, missing);

       }
       catch(Exception ex)
       {
        throw new Exception(ex.Message);
       }
       finally
       {
        myExcel.Workbooks.Close();
        myExcel.Quit();

        System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
        worksheet = null;
        myExcel = null;
        GC.Collect();
       }
       
      }

      /// <summary>
      /// 因为调用EXCEL后,结束时EXCEL进程并没有立即KILL,用这个方法调用可以KILL掉EXCEL
      /// </summary>
            public static void callToExcel(string FileName, string SheetName, System.Data.DataTable dt)
      {
       toExcel(FileName, SheetName, dt);
       GC.Collect();
      }
     }
    }

  • 相关阅读:
    摒弃FORM表单上传图片,异步批量上传照片
    小功能——简单代码实现邮箱发送邮件
    小工具 ——快速生成验证码
    [转]C++11 多线程
    [转]线性插值&双线性插值&三线性插值
    [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV
    windows的Timer和写文件方式串口注意!
    OPENCV3.1+VS 坑我笔记!
    最简单的PC机串口通信程序
    用MFC时,如果程序崩溃,检查内存,然后注意GDI数量,在任务管理器里选项-查看列-GDI数量
  • 原文地址:https://www.cnblogs.com/hyd309/p/1332783.html
Copyright © 2011-2022 走看看