• C#操作Excel进行读写


    1、参考文献:

      C#导出EXCEL的几种方法 - KJXY - 博客园 (cnblogs.com)

      C#(com组件)操作Excel读写 - 红烧狮子头 - 博客园 (cnblogs.com)

    2、添加Microsoft.Office.Interop.Excel引用

    3、编写静态方法

    public static bool SaveAsExcel(DataSet dataSet, bool isShowExcle)
            {
                System.Data.DataTable dataTable = dataSet.Tables[0];
                int rowNumber = dataTable.Rows.Count;//不包括字段名
                int columnNumber = dataTable.Columns.Count;
                int colIndex = 0;
    
                if (rowNumber == 0)
                {
                    return false;
                }
    
                string path = Path.Combine(System.Environment.CurrentDirectory, "Excel");
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                string filePath = Path.Combine(path, DateTime.Now.ToString("yyyyMMdd") + ".xlsx");
                if (!File.Exists(filePath))
                {
                    //建立Excel对象
                    Application excel = new Application();
                    //excel.Application.Workbooks.Add(true);
                    Workbook workbook = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                    Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
                    excel.Visible = isShowExcle;
                    Range range;
    
                    //生成字段名称
                    foreach (DataColumn col in dataTable.Columns)
                    {
                        colIndex++;
                        excel.Cells[1, colIndex] = col.ColumnName;
                    }
    
                    object[,] objData = new object[rowNumber, columnNumber];
    
                    for (int r = 0; r < rowNumber; r++)
                    {
                        for (int c = 0; c < columnNumber; c++)
                        {
                            objData[r, c] = dataTable.Rows[r][c];
                        }
                    }
                    
                    // 写入Excel
                    range = worksheet.get_Range(excel.Cells[2, 1], excel.Cells[rowNumber + 1, columnNumber]);
                    //range.NumberFormat = "@";//设置单元格为文本格式
                    range.Value2 = objData;
                    workbook.Close(true, filePath, null);
                    //退出Excel
                    excel.Quit();
                }
                else
                {
                    //通过指定路径打开xlms
                    Application excelApp = new Application();
                    Workbooks workbooks = excelApp.Workbooks;
                    Workbook workbook = workbooks.Open(filePath) as Workbook;
                    Worksheet worksheet = workbook.Worksheets[1] as Worksheet;
                    excelApp.Visible = isShowExcle;
    
                    worksheet.Activate();
                    int dtRows=dataSet.Tables[0].Rows.Count;
                    int dtColumn = dataSet.Tables[0].Columns.Count;
                    int row = worksheet.UsedRange.CurrentRegion.Rows.Count;
                    int column = worksheet.UsedRange.CurrentRegion.Columns.Count;
                    int Row = worksheet.Range["a1"].CurrentRegion.Rows.Count;
                    int Column = worksheet.Range["a1"].CurrentRegion.Columns.Count;
                    int actualColumn = Column == 1 ? dtColumn : Column;
                    if(Column == 1)
                    {
                        //添加标题
                        foreach (DataColumn col in dataTable.Columns)
                        {
                            excelApp.Cells[1, dataTable.Columns.IndexOf(col)+1] = col.ColumnName;
                        }
                    }
                    //指定从填充区域进行文本填充
                    //Range range = worksheet.get_Range("A1", "C2");
                    Range range=worksheet.get_Range(excelApp.Cells[Row+1, 1], excelApp.Cells[Row+dtRows, actualColumn]);
                    object[,] objArr = new object[dataSet.Tables[0].Rows.Count, dataSet.Tables[0].Columns.Count];
                    for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                    {
                        for(int j = 0; j < dataSet.Tables[0].Columns.Count;j++)
                        {
                            objArr[i,j] = dataSet.Tables[0].Rows[i][j];
                        }
                    }
                    range.Value2 = objArr;
                    workbook.Close(true, filePath, null);
                    excelApp.Workbooks.Close();
                    excelApp.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);//释放com对象,否则在任务管理器中一直运行
                    excelApp = null;
                }
                //worksheet.get_Range(excel.Cells[2, 1], excel.Cells[rowNumber + 1, 1]).NumberFormat = "yyyy-m-d h:mm";
    
                return true;
            }

    4、添加ListView转DataSet方法

    public static DataSet ConvertToDataTable(ListView lv)
            {
                DataSet ds=new DataSet();
                System.Data.DataTable dt = new System.Data.DataTable();
                dt.Clear();
                dt.Columns.Clear();
                //生成DataTable列头
                for (int i = 0; i < lv.Columns.Count; i++)
                {
                    dt.Columns.Add(lv.Columns[i].Text.Trim(), typeof(string));
                }
                //添加每行内容
                for (int i = 0; i < lv.Items.Count; i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 0; j < lv.Columns.Count; j++)
                    {
                        dr[j] = lv.Items[i].SubItems[j].Text.Trim();
                    }
                    dt.Rows.Add(dr);
                }
                ds.Tables.Add(dt);
                return ds;
            }

    5、测试调用

      说明:我在WinForm中添加了一个ListView,id没改,直接就是默认的listView1,共有五列。
    for (int i = 1; i < 10; i++)
                {
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = i.ToString();
                    lvi.SubItems.Add((i + 20).ToString());
    
                    lvi.SubItems.Add((i).ToString());
                    lvi.SubItems.Add("aaaaaaa");
                    lvi.SubItems.Add("bbbbbb");
                    listView1.Items.Add(lvi);
                }
                DataSet ds= ConvertToDataTable(listView1);
                string path = Path.Combine(System.Environment.CurrentDirectory, "Excel\\20220629.xlsx");
                CommonHelper.SaveAsExcel(ds, false);
    
         }

    演示操作

      如果不通过System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);释放com对象,那么任务管理器中WPS应用一直存活,导致后面再次打开WPS时黑屏。所以要记得释放COM对象

     

  • 相关阅读:
    yii框架原生代码
    分库分表
    get和post的区别
    echo print() print_r() var_dump()的区别
    cookie 和session 的区别
    memcached 常用命令及使用说明
    解决高并发
    C# 使用NLog记录日志
    CREATE DATABASE permission denied in database 'master'.
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • 原文地址:https://www.cnblogs.com/ZM191018/p/16425861.html
Copyright © 2020-2023  润新知