zoukankan      html  css  js  c++  java
  • 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;
            }
        }
  • 相关阅读:
    内核笔记之内存寻址
    熟悉了HDFS的基本架构,了解这方面的专业术语(持续更新)
    第一步:ubuntu下android实验环境的建立,以及真机调试环境搭建
    关于hadoop的一些研究优化方向
    第三步:熟悉android的相关控件
    第一步系统环境的搭建
    第二步:关于布局文件中的大小设置使用问题
    Hibernate笔记
    Java学习之路——用dom4j解析xml
    利用Servlet和jsp实现客户端与服务器端的用户登录信息验证
  • 原文地址:https://www.cnblogs.com/yu-shang/p/11815558.html
Copyright © 2011-2022 走看看