• VS2022 C# 读取 excel 2023年


    今天是2023年6月26日,我有一个excel表要读数据,然后放到winform程序来处理,网上的资料太旧,很多用不起来,试了一个可以使用,记录一下:

    一、excel文件后缀需要小写。

    二、用VS2022建一个winform程序,在NuGet中安装NPOI

    三、C#程序代码读取excel数据,感觉速度还是可以,很快:

    全部程序代码:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. using System.Windows.Forms;
    11. using NPOI.HSSF.UserModel;
    12. using NPOI.SS.UserModel;
    13. using NPOI.XSSF.UserModel;
    14. namespace readexcel
    15. {
    16. public partial class Form1 : Form
    17. {
    18. public class GT_table
    19. {
    20. public int id { get; set; }
    21. public string t1 { get; set; }
    22. public string t2 { get; set; }
    23. }
    24. public Form1()
    25. {
    26. InitializeComponent();
    27. }
    28. private void button1_Click(object sender, EventArgs e)
    29. {
    30. DataTable dt = ExcelToDatatable(@"D:\20231025.xlsx", "Sheet1", true);
    31. //将excel表格数据存入list集合中
    32. //EachdayTX定义的类,字段值对应excel表中的每一列
    33. List table = new List();
    34. foreach (DataRow dr in dt.Rows)
    35. {
    36. GT_table line = new GT_table
    37. {
    38. id = Convert.ToInt32(dr[0]),
    39. t1 = dr[1].ToString(),
    40. t2 = dr[2].ToString(),
    41. };
    42. listBox1.Items.Add(line.id + "," + line.t1 + "," + line.t2);
    43. table.Add(line);
    44. }
    45. }
    46. #region 读取Excel数据
    47. ///
    48. /// 将excel中的数据导入到DataTable中
    49. ///
    50. /// 文件路径
    51. /// excel工作薄sheet的名称
    52. /// 第一行是否是DataTable的列名,true是
    53. /// 返回的DataTable
    54. public static DataTable ExcelToDatatable(string fileName, string sheetName, bool isFirstRowColumn)
    55. {
    56. ISheet sheet = null;
    57. DataTable data = new DataTable();
    58. int startRow = 0;
    59. FileStream fs;
    60. IWorkbook workbook = null;
    61. int cellCount = 0;//列数
    62. int rowCount = 0;//行数
    63. try
    64. {
    65. fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    66. if (fileName.IndexOf(".xlsx") > 0) // 2007版本
    67. {
    68. workbook = new XSSFWorkbook(fs);
    69. }
    70. else if (fileName.IndexOf(".xls") > 0) // 2003版本
    71. {
    72. workbook = new HSSFWorkbook(fs);
    73. }
    74. if (sheetName != null)
    75. {
    76. sheet = workbook.GetSheet(sheetName);//根据给定的sheet名称获取数据
    77. }
    78. else
    79. {
    80. //也可以根据sheet编号来获取数据
    81. sheet = workbook.GetSheetAt(0);//获取第几个sheet表(此处表示如果没有给定sheet名称,默认是第一个sheet表)
    82. }
    83. if (sheet != null)
    84. {
    85. IRow firstRow = sheet.GetRow(0);
    86. cellCount = firstRow.LastCellNum; //第一行最后一个cell的编号 即总的列数
    87. if (isFirstRowColumn)//如果第一行是标题行
    88. {
    89. for (int i = firstRow.FirstCellNum; i < cellCount; ++i)//第一行列数循环
    90. {
    91. DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);//获取标题
    92. data.Columns.Add(column);//添加列
    93. }
    94. startRow = sheet.FirstRowNum + 1;//1(即第二行,第一行0从开始)
    95. }
    96. else
    97. {
    98. startRow = sheet.FirstRowNum;//0
    99. }
    100. //最后一行的标号
    101. rowCount = sheet.LastRowNum;
    102. for (int i = startRow; i <= rowCount; ++i)//循环遍历所有行
    103. {
    104. IRow row = sheet.GetRow(i);//第几行
    105. if (row == null)
    106. {
    107. continue; //没有数据的行默认是null;
    108. }
    109. //将excel表每一行的数据添加到datatable的行中
    110. DataRow dataRow = data.NewRow();
    111. for (int j = row.FirstCellNum; j < cellCount; ++j)
    112. {
    113. if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
    114. {
    115. dataRow[j] = row.GetCell(j).ToString();
    116. }
    117. }
    118. data.Rows.Add(dataRow);
    119. }
    120. }
    121. return data;
    122. }
    123. catch (Exception ex)
    124. {
    125. Console.WriteLine("Exception: " + ex.Message);
    126. return null;
    127. }
    128. }
    129. #endregion
    130. }
    131. }

  • 相关阅读:
    mybatis-generator新版本代码生成器
    基于PHP+laravel+vue自主研发的医院手术麻醉信息系统源码
    大模型技术实践(五)|支持千亿参数模型训练的分布式并行框架
    Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv 计算机竞赛
    算法工程师面经汇总
    python制作GIF动图
    SL3037内置MOS管 耐压60V降压恒压芯片 降12V或降24V 电路简单
    设置Oracle环境变量
    Linux之history历史指令查看
    Jenkins自动化部署
  • 原文地址:https://blog.csdn.net/ot512csdn/article/details/134052586