C#操作Excel的多种方式小结

 更新时间:2024年11月12日 08:38:05   作者:无熵~  
在项目开发过程和办公过程中,经常要遇到对Excel进行创建,读写等操作,本文为大家整理了一些C#操作Excel的方法,感兴趣的小伙伴可以了解一下

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

在项目开发过程和办公过程中,经常要遇到对Excel进行创建,读写等操作,excel太多师,整理也成了一大难题。通过程序对excel进行整理能快速提供开发和办公效率。

Excel操作几种方式

使用OleDb(过时)

使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)

使用开源库NPOI(常用,操作丰富)

使用OpenXml(效率高)

使用OleDb

通过OleDb操作excel需要安装AccessDatabaseEngine组件,对Excel文件的格式有一定的限制,不支持一些特定的Excel功能。性能可能不如其他方法,比较老旧,基本不用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
string excelFilePath = "D:\\Test\\test.xlsx";
private void OpenExcelByOleDb()
{
    string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFilePath};Extended Properties='Excel 12.0;HDR=YES;'";
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        try
        {
            connection.Open();
            Console.WriteLine("链接成功!");
 
            // 获取Excel文件中第一个工作表的数据
            string query = "SELECT * FROM [Sheet1$]";
            using (OleDbCommand command = new OleDbCommand(query, connection))
            using (OleDbDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // 假设第一列是字符串,第二列是整数
                    string stringValue = reader.GetString(0);
                    int intValue = reader.GetInt32(1);
 
                    Console.WriteLine($"String value: {stringValue}, Integer value: {intValue}");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误: {ex.Message}");
        }
    }
}

Microsoft.Office.Interop.Excel

通过Microsoft.Office.Interop.Excel COM组件操作Excel可以实现对Excel文件的高度控制,支持复杂的Excel操作。但对资源的管理需要谨慎处理,易造成资源泄漏且兼容性不高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
string excelFilePath = "D:\\Test\\test.xlsx";
private void OpenExcelByInteropExcel()
{
    // 创建Excel应用程序对象
    Excel.Application excelApp = new Excel.Application();
    excelApp.Visible = true; // 可见Excel应用程序界面
 
    // 打开Excel文件
    Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath);
    Excel.Worksheet worksheet = workbook.Sheets[1] as Excel.Worksheet;
 
    // 读取或写入数据
    Excel.Range range = worksheet.UsedRange;
    for (int row = 1; row <= range.Rows.Count; row++)
    {
        for (int column = 1; column <= range.Columns.Count; column++)
        {
            // 处理单元格数据
            var cellValue = range.Cells[row, column].Value;
            Console.WriteLine(cellValue.ToString());
            //range.Cells[row, column].Value = 1;
        }
    }
    #region 保存模板
    //object Nothing = System.Reflection.Missing.Value;
    //Microsoft.Office.Interop.Excel.Workbook workbook1 = excelApp.Workbooks.Add(Nothing);
    //Microsoft.Office.Interop.Excel.Worksheet worksheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets["Sheet2"];//打开Sheet2
    //worksheet1.Copy(workbook1.Sheets["Sheet1"], Type.Missing);//复制模板Sheet1内容
    //workbook.Close(false, Type.Missing, Type.Missing);
    //workbook1.SaveAs("modelpath", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    //workbook1.Close(false, Type.Missing, Type.Missing);
    #endregion
 
    // 释放资源
    workbook.Close(false);
    excelApp.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
}

使用开源库NPOI

使用开源库NPOI操作Excel跨平台,不依赖于Microsoft Office,适用于在服务器端等环境中操作Excel文件。支持读取和写入Excel文件,并提供了丰富的API。但对于复杂的Excel操作,不如COM组件灵活,无法实现一些高级功能。Nuget引用NPOI组件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
string excelFilePath = "D:\\Test\\test.xlsx";
private void OpenExcelByNPOI()
{
    // 读取Excel文件
    using (FileStream fs = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
    {
        IWorkbook workbook = new XSSFWorkbook(fs);
        ISheet sheet = workbook.GetSheetAt(0);
 
        // 遍历每一行
        for (int row = 0; row <= sheet.LastRowNum; row++)
        {
            IRow currentRow = sheet.GetRow(row);
            if (currentRow != null) // 确保行不为空
            {
                // 遍历每一列
                for (int column = 0; column < currentRow.LastCellNum; column++)
                {
                    ICell currentCell = currentRow.GetCell(column);
                    if (currentCell != null) // 确保单元格不为空
                    {
                        // 处理单元格数据
                        var cellValue = currentCell.ToString();
                        Console.WriteLine(cellValue);
                    }
                }
            }
        }
    }
}

使用OpenXml

使用OpenXml操作Excel,它直接对文件流进行操作,而无需将整个文档加载到内存中,无需安装 Microsoft Office,非常适合服务器端应用程序和批处理。Nuget引用DocumentFormat.OpenXml 组件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
string excelFilePath = "D:\\Test\\test.xlsx";
private void OpenExcelByOpenXml()
{
    //流式传输文件,性能高
    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(excelFilePath, false))
    {
        WorkbookPart workbookPart = doc.WorkbookPart;
        Sheet sheet = workbookPart.Workbook.Sheets.GetFirstChild<Sheet>();
        WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
 
        OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
        while (reader.Read())
        {
            if (reader.ElementType == typeof(DocumentFormat.OpenXml.Spreadsheet.Row))
            {
                DocumentFormat.OpenXml.Spreadsheet.Row row = (DocumentFormat.OpenXml.Spreadsheet.Row)reader.LoadCurrentElement();
                foreach (DocumentFormat.OpenXml.Spreadsheet.Cell cell in row.Elements<DocumentFormat.OpenXml.Spreadsheet.Cell>())
                {
                    string cellValue = GetCellValue(doc, cell);
                    Console.Write(cellValue + " ");
                }
                Console.WriteLine();
            }
        }
    }
 
}
/// <summary>
/// OpenXml获取单元格值
/// 流式传输
/// </summary>
/// <param name="doc"></param>
/// <param name="cell"></param>
/// <returns></returns>
private static string GetCellValue(SpreadsheetDocument doc, DocumentFormat.OpenXml.Spreadsheet.Cell cell)
{
    SharedStringTablePart stringTablePart = doc.WorkbookPart.SharedStringTablePart;
    string value = cell.CellValue.InnerXml;
 
    if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
    {
        return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
    }
    else
    {
        return value;
    }
}

Excel与DatagridView之间操作

Excel文件导入DateGridView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/// <summary>
/// Excel导入DataGridView
/// </summary>
/// <param name="excelFilePath"></param>
/// <param name="dataGridView"></param>
public static void ImportExcelToDataGridView(string excelFilePath, DataGridView dataGridView)
{
    Excel.Application excelApp = new Excel.Application();
    Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath);
    Excel.Worksheet worksheet = workbook.Sheets[1];
    Range usedRange = worksheet.UsedRange;
 
    for (int i = 1; i <= usedRange.Columns.Count; i++)
    {
        DataGridViewColumn column = new DataGridViewColumn();
        column.Name = "Column" + i;
        column.HeaderText = "Column" + i;
        column.CellTemplate = new DataGridViewTextBoxCell();
        dataGridView.Columns.Add(column);
    }
    dataGridView.Rows.Clear();
    for (int i = 1; i <= usedRange.Rows.Count; i++)
    {
        DataGridViewRow row = new DataGridViewRow();
        
        for (int j = 1; j <= usedRange.Columns.Count; j++)
        {
            row.Cells.Add(new DataGridViewTextBoxCell());
            row.Cells[j - 1].Value = usedRange.Cells[i, j].Value;
 
        }
        dataGridView.Rows.Add(row);
    }
 
    workbook.Close();
    excelApp.Quit();
 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
 
    worksheet = null;
    workbook = null;
    excelApp = null;
 
    GC.Collect();
}

DateGridView导出Excel文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/// <summary>
/// Datagridview导出excel
/// </summary>
/// <param name="fileName"></param>
/// <param name="myDGV"></param>
private void DatagridViewToExcel( DataGridView myDGV)
{
    string saveFileName = "";
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.DefaultExt = "xls";
    saveDialog.Filter = "Excel文件|*.xls";
    if(saveDialog.ShowDialog()==DialogResult.Cancel)
    {
        return;
    }
    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");
        return;
    }
    Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
    Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
    Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
                                                                                                                          //写入标题
    for (int i = 0; i < myDGV.ColumnCount; i++)
    {
 
        worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;
    }
 
    //写入数值
    for (int r = 0; r < myDGV.Rows.Count; r++)
    {
        for (int i = 0; i < myDGV.ColumnCount; i++)
        {
            worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;
        }
        System.Windows.Forms.Application.DoEvents();
    }
    worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
    if (saveFileName != "")
    {
        try
        {
            workbook.Saved = true;
            workbook.SaveCopyAs(saveFileName);
        }
        catch (Exception ex)
        {
            MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
        }
    }
    xlApp.Quit();
    GC.Collect();//强行销毁
    MessageBox.Show("文件: " + saveFileName + ".xls 保存成功", "信息提示",
    MessageBoxButtons.OK, MessageBoxIcon.Information);
}

CSV与DatagridView之间操作

csv文件导入DateGridView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// <summary>
/// 将csv文件数据导入datagridview
/// </summary>
/// <param name="csvPath"></param>
/// <returns></returns>
public static void ImportCSV(DataGridView dgv)
{
    string filePath;
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "CSV files (*.csv)|*.csv";
    openFileDialog.FilterIndex = 0;
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        filePath = openFileDialog.FileName;
    }
    else
    {
        return;
    }
    System.Data.DataTable dt = new System.Data.DataTable();
    using (StreamReader sr = new StreamReader(filePath))
    {
        string[] headers = sr.ReadLine().Split(',');
        string headerValue = null;
        foreach (string header in headers)
        {
            headerValue = header.Replace("\"", "");
            dt.Columns.Add(headerValue);
        }
        while (!sr.EndOfStream)
        {
            string[] rows = sr.ReadLine().Split(',');
            DataRow dr = dt.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                dr[i] = rows[i].Replace("\"", "");
            }
            dt.Rows.Add(dr);
        }
    }
    dgv.DataSource = dt;
}

DateGridView导出csv文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <summary>
/// DateGridView导出到csv格式的Excel,通用 
/// </summary>
/// <param name="dgv"></param>
public static void ExportToCSV(DataGridView dgv)
{
    string filePath;
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.Filter = "CSV files (*.csv)|*.csv";
    saveFileDialog.FilterIndex = 0;
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        filePath = saveFileDialog.FileName;
    }
    else
    {
        return;
    }
    using (StreamWriter sw = new StreamWriter(filePath))
    {
        // 写入列标题
        string headers = string.Join(",", dgv.Columns.Cast<DataGridViewColumn>().Select(column => "\"" + column.HeaderText + "\"").ToArray());
        sw.WriteLine(headers);
 
        // 写入数据行
        foreach (DataGridViewRow row in dgv.Rows)
        {
            string line = string.Join(",", row.Cells.Cast<DataGridViewCell>().Select(cell => "\"" + cell.Value?.ToString().Replace("\"", "\"\"") + "\"").ToArray());
            sw.WriteLine(line);
        }
    }
}

到此这篇关于C#操作Excel的多种方式小结的文章就介绍到这了,更多相关C#操作Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/lvxingzhe3/article/details/143698231

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C#中DateTime.Compare()比较时间大小

    C#中DateTime.Compare()比较时间大小

    本文主要介绍了C#中DateTime.Compare()比较时间大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用C#的aforge类库识别验证码实例

    使用C#的aforge类库识别验证码实例

    这篇文章主要介绍了使用C#的aforge类库识别验证码实例,aforge类库是一个非常强大的类库,包括计算机视觉与人工智能、图像处理、神经网络、遗传算法、机器学习、机器人等领域,需要的朋友可以参考下
    2014-08-08
  • C#属性get和set使用示例详解

    C#属性get和set使用示例详解

    属性是C#中的一种特殊成员,它允许外部以受控方式访问类的状态,属性通过get和set方法实现对类私有字段的读取和修改,本文给大家介绍C#属性get和set使用,感兴趣的朋友一起看看吧
    2024-09-09
  • C#/VB.NET 自定义PPT动画路径的步骤

    C#/VB.NET 自定义PPT动画路径的步骤

    这篇文章主要介绍了C#/VB.NET 自定义PPT动画路径的步骤,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-05-05
  • C# CefSharp 根据输入日期段自动选择日期的操作代码

    C# CefSharp 根据输入日期段自动选择日期的操作代码

    这篇文章主要介绍了C# CefSharp 根据输入日期段自动选择日期的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解

    深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解

    本篇文章是对用Wait与Pulse模拟一些同步构造的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C# Newtonsoft.Json 的使用说明

    C# Newtonsoft.Json 的使用说明

    这篇文章主要介绍了C# Newtonsoft.Json 的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C#使用ODBC与OLEDB连接数据库的方法示例

    C#使用ODBC与OLEDB连接数据库的方法示例

    这篇文章主要介绍了C#使用ODBC与OLEDB连接数据库的方法,结合实例形式分析了C#基于ODBC与OLEDB实现数据库连接操作简单操作技巧,需要的朋友可以参考下
    2017-05-05
  • C#调用FFmpeg操作音视频的实现示例

    C#调用FFmpeg操作音视频的实现示例

    本文主要介绍了C#调用FFmpeg操作音视频的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • c#之圆形无标题栏椭圆窗体的实现详解

    c#之圆形无标题栏椭圆窗体的实现详解

    本篇文章是对c#中圆形无标题栏椭圆窗体的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论