首页 > 编程语言 >c# 读取上传excel转换为DataTable

c# 读取上传excel转换为DataTable

时间:2024-09-09 08:52:39浏览次数:10  
标签:files c# excel columnName int new columnNameCounts DataTable

var files = Request.Files;

if (files == null || files.Count == 0)
{
    return Json(new { code = 1, msg = "未获取到文件" });
}



var file = files[0];

var dt = ReadExcelToDataTable(file.InputStream);

return Json(new { code = 1, msg = "已读取Excel到DataTable" });
        static DataTable ReadExcelToDataTable(Stream stream)
        {
            DataTable dataTable = new DataTable();

            // 读取Excel文件
            XSSFWorkbook workbook = new XSSFWorkbook(stream);
            ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表

            // 获取列数
            int columnsCount = sheet.GetRow(0).LastCellNum;

            // 用于存储列名和对应的重复次数
            Dictionary<string, int> columnNameCounts = new Dictionary<string, int>();

            // 创建表头,处理重复的列名
            for (int i = 0; i < columnsCount; i++)
            {
                object obj = sheet.GetRow(0).GetCell(i);
                if (obj == null || obj.ToString() == string.Empty)
                {
                    dataTable.Columns.Add(new DataColumn("Columns" + i.ToString()));
                }
                else
                {
                    //string columnName = sheet.GetRow(0).GetCell(i).StringCellValue;
                    string columnName = obj.ToString();
                    string uniqueColumnName = GetUniqueColumnName(columnName, columnNameCounts);
                    dataTable.Columns.Add(uniqueColumnName);
                }

            }

            // 填充数据
            for (int i = 1; i <= sheet.LastRowNum; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dataRow = dataTable.NewRow();
                for (int j = 0; j < columnsCount; j++)
                {
                    if (row.GetCell(j) != null)
                    {
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
                dataTable.Rows.Add(dataRow);
            }

            return dataTable;
        }

        static string GetUniqueColumnName(string columnName, Dictionary<string, int> columnNameCounts)
        {
            if (!columnNameCounts.ContainsKey(columnName))
            {
                columnNameCounts[columnName] = 1;
                return columnName;
            }
            else
            {
                int count = columnNameCounts[columnName];
                columnNameCounts[columnName] = count + 1;
                return $"{columnName}{count + 1}";
            }
        }

标签:files,c#,excel,columnName,int,new,columnNameCounts,DataTable
From: https://www.cnblogs.com/duixue/p/18403883

相关文章

  • 【C++】list(下)
    个人主页~list(上)~list四、模拟实现1、list.h(1)关于整个list的搭建①节点②迭代器③接口(2)自定义类型实例化2、test.cpp(1)test1(2)test2五、额外小知识四、模拟实现1、list.h#pragmaonce#include<iostream>namespacelittle_monster{ template<classT> ......
  • c++的初始化列表与const成员
    初始化列表与const成员const成员使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。在定义const成员时......
  • c++的构造函数与析构函数
    构造函数与析构函数构造函数1、什么构造函数类、结构、联合中的特殊成员函数,与类名、结构名、联合名同的成员函数,没有返回值。class类名{public:  类名(参数列表) {     }};2、何时调用构造函数当创建类对象时(实例化对象)会自动调用构造函......
  • 2024年“羊城杯”粤港澳大湾区网络安全大赛Misc 部分解析
    2024年“羊城杯”粤港澳大湾区网络安全大赛Misc部分解析前言:Misc-不一样的数据库_2:Misc-hiden:Misc-miaoro:Misc-so_much:前言:本次解析是后期复现当时没时间打用于交流学习,感谢支持!![X]......
  • 【愚公系列】《AIGC辅助软件开发》018-AI辅助后端编程:快速生成接口文档
    ......
  • 【愚公系列】《AIGC辅助软件开发》019-AI 辅助测试与调试:AI辅助测试与调试应用案例
    ......
  • shp文件转换为CAD文件(dxf格式)
    今天晚上来试一下SHP文件转换为CAD文件。看到一个粉丝留言说能不能实现arcgis图斑转CAD填充的代码。首先我对CAD不熟,基本没接触过,查了查DWG是CAD的专有文件。在网上查资料又发现CAD软件支持DXF格式。昨天写了《三种通过代码创建矢量文件的方法及例子》,依稀记得geopandas就......
  • 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree
    前言树状数组,即树形存储的数组,又称BinaryIndexedTree或FenwickTree。抛开它树形的存储结构,这种神奇的数据结构的应用看起来与「树」没什么关系:有一个序列\(A=(A_1,A_2,\dots,A_N)\),在不超过\(\mathcalO(\logN)\)的时间复杂度内完成下列操作:\(\to~\)求\([L,R]\)区间内所......
  • Cooley-Tukey FFT算法的非递归实现
    一维情况#include<iostream>#include<complex>#include<cmath>constdoublePI=3.14159265358979323846;//交换位置voidswap(std::complex<double>&a,std::complex<double>&b){std::complex<double>temp=a......
  • AtCoder Beginner Contest 274 A~E 题解
    吐槽:这比赛名字为啥没有英文版。。。A-BattingAverage题目大意给定整数\(A,B\),输出\(\fracBA\),保留三位小数。\(1\leA\le10\)\(0\leB\leA\)分析签到题,使用printf或cout格式化输出即可。代码#include<cstdio>usingnamespacestd;intmain(){ inta,b; sc......