PS:纯数字单元格左上角需带有绿色小三角   解决方案:https://jingyan.baidu.com/article/9158e00010848aa2541228b2.html

    /*
*引用 NuGet包 Spire.XLS
*/
/// <summary>
/// Excel帮助类
/// </summary>
public class ExcelHelper
{
/// <summary>
/// 将Excel以文件流转换DataTable
/// </summary>
/// <param name="hasTitle">是否有表头</param>
/// <param name="path">文件路径</param>
/// <param name="tableindex">文件簿索引</param>
public DataTable ExcelToDataTableFormPath(bool hasTitle = true, string path = "", int tableindex = )
{
//新建Workbook
Workbook workbook = new Workbook();
//将当前路径下的文件内容读取到workbook对象里面
workbook.LoadFromFile(path);
//得到第一个Sheet页
Worksheet sheet = workbook.Worksheets[tableindex];
return SheetToDataTable(hasTitle, sheet);
}
/// <summary>
/// 将Excel以文件流转换DataTable
/// </summary>
/// <param name="hasTitle">是否有表头</param>
/// <param name="stream">文件流</param>
/// <param name="tableindex">文件簿索引</param>
public DataTable ExcelToDataTableFormStream(bool hasTitle = true, Stream stream = null, int tableindex = )
{
//新建Workbook
Workbook workbook = new Workbook();
//将文件流内容读取到workbook对象里面
workbook.LoadFromStream(stream);
//得到第一个Sheet页
Worksheet sheet = workbook.Worksheets[tableindex];
return SheetToDataTable(hasTitle, sheet);
} private DataTable SheetToDataTable(bool hasTitle, Worksheet sheet)
{
int iRowCount = sheet.Rows.Length;
int iColCount = sheet.Columns.Length;
DataTable dt = new DataTable();
//生成列头
for (int i = ; i < iColCount; i++)
{
var name = "column" + i;
if (hasTitle)
{
var txt = sheet.Range[, i + ].Text;
if (!string.IsNullOrEmpty(txt)) name = txt;
}
while (dt.Columns.Contains(name)) name = name + "_1";//重复行名称会报错。
dt.Columns.Add(new DataColumn(name, typeof(string)));
}
//生成行数据
int rowIdx = hasTitle ? : ;
for (int iRow = rowIdx; iRow <= iRowCount; iRow++)
{
DataRow dr = dt.NewRow();
for (int iCol = ; iCol <= iColCount; iCol++)
{
dr[iCol - ] = sheet.Range[iRow, iCol].Text;
}
dt.Rows.Add(dr);
}
return RemoveEmpty(dt);
} /// <summary>
/// 去除空行
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
private DataTable RemoveEmpty(DataTable dt)
{
List<DataRow> removelist = new List<DataRow>();
for (int i = ; i < dt.Rows.Count; i++)
{
bool rowdataisnull = true;
for (int j = ; j < dt.Columns.Count; j++)
{
if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
{
rowdataisnull = false;
}
}
if (rowdataisnull)
{
removelist.Add(dt.Rows[i]);
}
}
for (int i = ; i < removelist.Count; i++)
{
dt.Rows.Remove(removelist[i]);
}
return dt;
}
}

C# 将Excel以文件流转换DataTable的更多相关文章

  1. 下载excel(接收文件流)

    /**  * 文件流转换 主要代码块,可自定义下载文件名称  * @param {} data  */ export function download(data, titName) {   if ( ...

  2. vue文件流转换成pdf预览(pdf.js+iframe)

    参考文档:https://www.jianshu.com/p/242525315bf6 PDFJS: https://mozilla.github.io/pdf.js/     支持获取文件流到客户端 ...

  3. 文件下载post请求,返回文件流转换zip,

    最近一个需求是批量下载文件,最后打包成zip包,post请求, 因为是文件流下载,所以在取后台数据的时候,要多传递一个[responseType: ‘blob’]这个参数 download() { t ...

  4. SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable

    MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上). SqlBulkCopy 类允许编写提供类似功能的托管代码解决方 ...

  5. piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql

    piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql 需要不个mssql的sql文件导入mysql.他们的时间戳格式不同..ms用的是自定义的时 ...

  6. Java 读取excel 文件流

    public static void initType(String path) { try { //1 获取excel文件流 excel xls 文件 暂不支持xlsx if (path.conta ...

  7. ExcelHelper----根据指定样式的数据,生成excel(一个sheet1页)文件流

    /// <summary> /// Excel导出类 /// </summary> public class ExcelHelper { /// <summary> ...

  8. vue中下载excel的使用,后端链接两种情况,一个是链接,一个是文件流

    vue中下载excel使用 一.这是第一种情况,后台链接地址返回的是一个url,这个时候我只要在导出按钮上绑定exportData()这个事件方法就好了 exportData() {     this ...

  9. Vue接收后端传过来excel表格的文件流并下载

    题外话:当接收文件流时要确定文件流的类型,但也有例外就是application/octet-stream类型,主要是只用来下载的类型,这个类型简单理解意思就是通用类型类似 var .object.ar ...

随机推荐

  1. 最新 汇通达java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 汇通达等10家互联网公司的校招Offer,因为某些自身原因最终选择了 汇通达.6.7月主要是做系统复习.项目复盘.Leet ...

  2. Nginx 开启支持谷歌Brotli压缩算法

    参考链接:https://cloud.tencent.com/developer/article/1501009

  3. POJ 1015 Jury Compromise (记录路径的背包问题)

    (点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...

  4. C++中如何设计一个类只能在堆或者栈上创建对象,面试题

    设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调 ...

  5. mysql 登录修改密码与数据库备份

    1.mysql首次登录修改密码 mysql -uroot -p(首次登录无密码,按回车即可:如果无法登陆,修改mysql配置文件,在[mysqld]最后一行加skip-grant-tables即可登录 ...

  6. 第七章 ZYNQ-MIZ701 GPIO使用之EMIO

    7.0难度系数★☆☆☆☆☆☆ 7.1硬件截图 7.1.1 PCB上的位置 7.1.1 PCB上的位置 7.2电路分析 本次实验用到的是LD_A0~LD_A3,管脚定义如下表所示. LD_A0:F17 ...

  7. shell习题第19题:最常用的命令

    [题目要求] 查看使用最多的10个命令 [核心要点] history 或者 ~/.bash_history sort uniq [脚本] #!/bin/bash # history就是调用cat ~/ ...

  8. Spring集成kafka,消费者运行时内存占用会一直增长

    Spring集成kafka,消费者运行时内存占用会一直增长? 20C 本人用Spring集成kafka消费者,发布运行时内存占用会一直升高,最后程序挂掉.请各位大神看看,提供解决方法 以下是我的配置文 ...

  9. MyBatis 示例-主键回填

    测试类:com.yjw.demo.PrimaryKeyTest 自增长列 数据库表的主键为自增长列,在写业务代码的时候,经常需要在表中新增一条数据后,能获得这条数据的主键 ID,MyBatis 提供了 ...

  10. Jmeter4.0---- 测试数据说明(17)

    1.说明 jmeter工具对于请求的测试结果,有多种形式展现,但是数据比较难懂,现在针对不同的展现做具体的说明. 2.监听器 (一)图形结果 (1)样本数目:总共发到服务器的请求数 (2)最新样本:服 ...