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对象

 

 

 

posted @ 2022-06-30 10:16  !>Mon<!  阅读(762)  评论(0编辑  收藏  举报