• C# 将Excel以文件流转换DataTable


     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 = 0)
            {
                //新建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 = 0)
            {
                //新建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 = 0; i < iColCount; i++)
                {
                    var name = "column" + i;
                    if (hasTitle)
                    {
                        var txt = sheet.Range[1, i + 1].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 ? 2 : 1;
                for (int iRow = rowIdx; iRow <= iRowCount; iRow++)
                {
                    DataRow dr = dt.NewRow();
                    for (int iCol = 1; iCol <= iColCount; iCol++)
                    {
                        dr[iCol - 1] = 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 = 0; i < dt.Rows.Count; i++)
                {
                    bool rowdataisnull = true;
                    for (int j = 0; 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 = 0; i < removelist.Count; i++)
                {
                    dt.Rows.Remove(removelist[i]);
                }
                return dt;
            }
        }
  • 相关阅读:
    【求助】测试XCode v8.0的正向反向功能
    新生命XProxy代理V1.1.2008.0307 (开源)
    1,日志组件XLog
    关于 title 属性导致触发 mousedown 事件时连带触发 mousemove
    CSS3制作跳蛋
    JQuery Pagination With Bootstrap
    关于 placeholder 在 360chrome 下的兼容性问题记录
    jQuery 模拟 ubuntu 3D desktop 的 Dodge Effect 效果
    网站导航(多视图页面:MultiView 和 Wizard 控件)
    自定义服务器控件(控件状态和事件)
  • 原文地址:https://www.cnblogs.com/yu-shang/p/11815558.html
Copyright © 2020-2023  润新知