C# excel与DataTable之间的转换

这篇具有很好参考价值的文章主要介绍了C# excel与DataTable之间的转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意,Excel读入DataTable需要使用NPOI包

/// <summary>
  /// Excel导入成Datable
  /// </summary>
  /// <param name="file">导入路径(包含文件名与扩展名)</param>
  /// <returns></returns>
  public static DataTable ExcelToTable(string file, string sheetName = "")
  {
    DataTable dt = new DataTable();
    IWorkbook workbook = null;
    try
    {

      string fileExt = Path.GetExtension(file).ToLower();
      using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
      {
        //XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
        if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(fs); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(fs); } else { workbook = null; }
        if (workbook == null) { return null; }

        ISheet sheet = string.IsNullOrWhiteSpace(sheetName) ? workbook.GetSheetAt(0) : workbook.GetSheet(sheetName);

        //表头  
        IRow header = sheet.GetRow(sheet.FirstRowNum);
        if (header == null)
        {
          throw new Exception("Excel表没有数据,请添加数据");
        }
        List<int> columns = new List<int>();
        for (int i = 0; i < header.LastCellNum; i++)
        {
          object obj = GetValueType(header.GetCell(i));
          if (obj == null || obj.ToString().Trim() == string.Empty)
          {
            continue;
          }
          else
          {
            dt.Columns.Add(new DataColumn(obj.ToString()));
          }
          columns.Add(i);
        }
        //数据  
        for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
        {
          DataRow dr = dt.NewRow();
          bool hasValue = false;
          foreach (int j in columns)
          {
            if (sheet.GetRow(i) != null) {
              dr[j] = GetValueType(sheet.GetRow(i).GetCell(j));
            }
            
            //if (dr[j] != null && dr[j].ToString() != string.Empty)
            //{
            //  hasValue = true;
            //}
          }
          //if (hasValue)
          //{
          //  dt.Rows.Add(dr);
          //}
          dt.Rows.Add(dr);

        }
        dt.AcceptChanges();

      }
      return dt;
    }
    catch (Exception e)
    {
      return null;
    }
    finally
    {
      if (dt != null) { dt.Dispose(); }
      if (workbook != null) { workbook = null; }
    }
  }
  /// <summary>
  /// 获取单元格类型
  /// </summary>
  /// <param name="cell"></param>
  /// <returns></returns>
  private static object GetValueType(ICell cell)
  {
    if (cell == null)
      return null;
    switch (cell.CellType)
    {
      case CellType.Blank: //BLANK:  
        return "";
      case CellType.Boolean: //BOOLEAN:  
        return cell.BooleanCellValue;
      case CellType.Numeric: //NUMERIC:  
        return cell.NumericCellValue;
      case CellType.String: //STRING:  
        return cell.StringCellValue;
      case CellType.Error: //ERROR:  
        return cell.ErrorCellValue;
      case CellType.Formula: //FORMULA:  
      default:
        return "=" + cell.CellFormula;
    }
  }

DataTable读入Excel

/// <summary>
		/// Datatable生成Excel表格并返回路径
		/// </summary>
		/// <param name="m_DataTable">Datatable</param>
		/// <param name="s_FileName">文件名</param>
		/// <returns></returns>
		public static string DataToExcel(System.Data.DataTable m_DataTable, string s_FileName)
		{
			//string FileName = @"C:\Users\JK\Desktop\DataTableToExcel\" + s_FileName + ".xlsx";  //文件存放路径
			string FileName = s_FileName;
			if (System.IO.File.Exists(FileName))                                //存在则删除
			{
				System.IO.File.Delete(FileName);
			}
			System.IO.FileStream objFileStream;
			System.IO.StreamWriter objStreamWriter;
			string strLine = "";
			objFileStream = new System.IO.FileStream(FileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
			objStreamWriter = new System.IO.StreamWriter(objFileStream, Encoding.Unicode);
			for (int i = 0; i < m_DataTable.Columns.Count; i++)
			{
				strLine = strLine + m_DataTable.Columns[i].Caption.ToString() + Convert.ToChar(9);      //写列标题
			}
			objStreamWriter.WriteLine(strLine);
			strLine = "";
			for (int i = 0; i < m_DataTable.Rows.Count; i++)
			{
				for (int j = 0; j < m_DataTable.Columns.Count; j++)
				{
					if (m_DataTable.Rows[i].ItemArray[j] == null)
						strLine = strLine + " " + Convert.ToChar(9);                                    //写内容
					else
					{
						string rowstr = "";
						rowstr = m_DataTable.Rows[i].ItemArray[j].ToString();
						if (rowstr.IndexOf("\r\n") > 0)
							rowstr = rowstr.Replace("\r\n", " ");
						if (rowstr.IndexOf("\t") > 0)
							rowstr = rowstr.Replace("\t", " ");
						strLine = strLine + rowstr + Convert.ToChar(9);
					}
				}
				objStreamWriter.WriteLine(strLine);
				strLine = "";
			}
			objStreamWriter.Close();
			objFileStream.Close();
			return FileName;        //返回生成文件的绝对路径
		}

文章来源地址https://www.toymoban.com/news/detail-675060.html

到了这里,关于C# excel与DataTable之间的转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#实现将excel转换成pdf的三种方法

    本人经过一上午的搜索,总结了C#将excel转pdf的三种方法(导出的excel转化成pdf下载下来)。 设计文章数量较多,没有转载请见谅。 下载地址https://www.e-iceblue.cn/Downloads/Free-Spire-XLS-NET.html 附带MemoryStream与FileStream的相互转换 以上三种方法经过试验是可以使用的。 据说还有用py

    2024年02月04日
    浏览(44)
  • C#中DataTable实现筛选查询

    2024年02月15日
    浏览(35)
  • DataTable扩展 列转行方法(2*2矩阵转换)

      源数据 如图所示  转换后的数据 DataTable newdt = dt.AsEnumerable().Where(p = p.Fieldstring(\\\"City\\\") == \\\"武汉\\\").CopyToDataTable().PivotDatatableColToRow(\\\"SDateTime,PM25,PM10,O3,NO2,SO2,CO\\\");

    2024年02月10日
    浏览(32)
  • C# Winform DataGridView 控件和 DataTable

    目录 一、概述 二、DataTable 的用法 1.创建表和列 2.添加行 3.取值和赋值 4.删除行 5.遍历 DataTable 6.判断 DataTable 列中是否存在某个值 7.设置主键 8.获取 DataRow 所在的行号 9.DataTable 转换为 List 10.将 List 转 DataTable 三、DataGridView 的用法 1.绑定数据 2.获取绑定的数据源 3.获取 / 设置

    2024年02月10日
    浏览(42)
  • C# 在控制台整齐的输出 DataTable

    效果: 在 Winform 平台,可以用 DataGridView 这样的控件来显示数据库的表单数据,但在 C# 控制台项目中,如果有用到数据库查询,我们想看看查询语句的效果,就比较困难了,比如,我随意写了一个控制台输出,代码如下: 效果: 在 Navicat 16 for MySQL 软件中的查询结果 由于没

    2024年02月12日
    浏览(60)
  • C#中将DataTable转化成ListT的方法解析

    在C#中,数据的操作是至关重要的一个方面,常常需要将数据从一个形式转换成另一个形式以满足我们的需求。其中,DataTable和List是常见的两种数据形式。DataTable是一种表格形式的数据类型,它以行和列的形式存储数据。List是一种集合类型,它可以存储任意类型的对象,并且

    2024年02月16日
    浏览(40)
  • C#获取DataTable的前N行数据然后按指定字段排序

    可以使用以下三种代码: 控制台应用程序FilterDataTableDemo  

    2024年02月11日
    浏览(41)
  • c# 实现sql查询DataTable数据集 对接SqlSugar ORM

    有时候对于已经查询到的数据集,想要进行二次筛选或者查询,还得再查一遍数据库 或者其他的一些逻辑处理不太方便,就想着为什么不能直接使用sql来查询DataTable呢? 搜索全网没找到可用方案,所以自己实现了一个。 主要实现思路是使用 SQLite In-Memory Database 内存数据库,

    2024年02月12日
    浏览(36)
  • 循环可变化的集合 数组 datatable 等 || c# winfrom DataGridView 动态UI下载功能

          1,使用组件DataGridView 2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型) 3,需要用到异步线程。如果是不控制数据源的话,需要使用UI安全线程;(使用Control.Invoke或Control.BeginInvoke方法) 4,DataGridView的列如果设置图片,尽量代码设置 5,DataT

    2024年02月19日
    浏览(40)
  • C#创建DataTable并填充数据,按钮事件实现全选,并到全选的值。wpf开发

    wpf开发中,用事件创建一个datatable度填充到datagird里面,在datagrid里面有第一列是复选框。用一单击事件实现全选,用一个按钮事件得到所选中的值。 Window x:Class=\\\"WpfApp4.MainWindow\\\"         xmlns=\\\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\\\"         xmlns:x=\\\"http://schemas.microsoft.com

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包