dataTable和excel的转换

来源:互联网 发布:特别好的句子 知乎 编辑:程序博客网 时间:2024/06/01 20:26

转自http://www.cnblogs.com/mora1988/p/5715097.html
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel
添加NPOI的.dll程序集引用,下载自http://npoi.codeplex.com/releases
1.第一种是根据excel文件路径读取excel并返回datatable
   /// <summary>        /// 将excel文件内容读取到DataTable数据表中        /// </summary>        /// <param name="fileName">文件完整路径名</param>        /// <param name="sheetName">指定读取excel工作薄sheet的名称</param>        /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param>        /// <returns>DataTable数据表</returns>        public static DataTable ReadExcelToDataTable(string fileName, string sheetName = null, bool isFirstRowColumn = true)        {            //定义要返回的datatable对象            DataTable data = new DataTable();//datatable格式,里面存放所有的表格的内容,可以直接显示出来            //excel工作表            NPOI.SS.UserModel.ISheet sheet = null;            //数据开始行(排除标题行)            int startRow = 0;            try            {                if (!File.Exists(fileName))                {                    return null;                }                //根据指定路径读取文件                FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);                //根据文件流创建excel数据结构                NPOI.SS.UserModel.IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fs);                //IWorkbook workbook = new HSSFWorkbook(fs);                //如果有指定工作表名称,这里是处理表名,表名可以给定名称                if (!string.IsNullOrEmpty(sheetName))                {                    sheet = workbook.GetSheet(sheetName);                    //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet                    if (sheet == null)                    {                        sheet = workbook.GetSheetAt(0);                    }                }                else                {                    //如果没有指定的sheetName,则尝试获取第一个sheet                    sheet = workbook.GetSheetAt(0);                }                if (sheet != null)                {                    NPOI.SS.UserModel.IRow firstRow = sheet.GetRow(0); //得到表格的第一行                    //一行最后一个cell的编号 即总的列数                    int cellCount = firstRow.LastCellNum; //读取的表格的最后一列,cellcount为总的列数                    //如果第一行是标题列名                    if (isFirstRowColumn)                    {                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)                        {                            NPOI.SS.UserModel.ICell cell = firstRow.GetCell(i);                            if (cell != null)                            {                                string cellValue = cell.StringCellValue;                                if (cellValue != null)                                {                                    DataColumn column = new DataColumn(cellValue);//column是列名,这里读取表格的第一行,依次得到每一列的列名                                    data.Columns.Add(column);//data中保存列名                                }                            }                        }                        startRow = sheet.FirstRowNum + 1;//读取表格的行数开始从第二行开始,第一行是列名                    }                    else                    {                        startRow = sheet.FirstRowNum;                    }                    //最后一列的标号                    int rowCount = sheet.LastRowNum;                    for (int i = startRow; i <= rowCount; ++i)//每行数据进行处理                    {                        NPOI.SS.UserModel.IRow row = sheet.GetRow(i);                        if (row == null) continue; //没有数据的行默认是null                               DataRow dataRow = data.NewRow();                        for (int j = row.FirstCellNum; j < cellCount; ++j)//每一列数据进行处理                        {                            if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null                                dataRow[j] = row.GetCell(j).ToString();//第i行的第j列的元素                        }                        data.Rows.Add(dataRow);                    }                }                return data;            }            catch (Exception ex)            {                throw ex;            }        }



2.第二种是将excel文件流读取到datatable中

/// <summary>        /// 将文件流读取到DataTable数据表中        /// </summary>        /// <param name="fileStream">文件流</param>        /// <param name="sheetName">指定读取excel工作薄sheet的名称</param>        /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param>        /// <returns>DataTable数据表</returns>        public static DataTable ReadStreamToDataTable(Stream fileStream, string sheetName = null, bool isFirstRowColumn = true)        {            //定义要返回的datatable对象            DataTable data = new DataTable();            //excel工作表            Npoi.SS.UserModel.ISheet sheet = null;            //数据开始行(排除标题行)            int startRow = 0;            try            {                //根据文件流创建excel数据结构,NPOI的工厂类WorkbookFactory会自动识别excel版本,创建出不同的excel数据结构                Npoi.SS.UserModel.IWorkbook workbook = Npoi.SS.UserModel.WorkbookFactory.Create(fileStream);                //如果有指定工作表名称                if (!string.IsNullOrEmpty(sheetName))                {                    sheet = workbook.GetSheet(sheetName);                    //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet                    if (sheet == null)                    {                        sheet = workbook.GetSheetAt(0);                    }                }                else                {                    //如果没有指定的sheetName,则尝试获取第一个sheet                    sheet = workbook.GetSheetAt(0);                }                if (sheet != null)                {                    Npoi.SS.UserModel.IRow firstRow = sheet.GetRow(0);                    //一行最后一个cell的编号 即总的列数                    int cellCount = firstRow.LastCellNum;                    //如果第一行是标题列名                    if (isFirstRowColumn)                    {                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)                        {                            Npoi.SS.UserModel.ICell cell = firstRow.GetCell(i);                            if (cell != null)                            {                                string cellValue = cell.StringCellValue;                                if (cellValue != null)                                {                                    DataColumn column = new DataColumn(cellValue);                                    data.Columns.Add(column);                                }                            }                        }                        startRow = sheet.FirstRowNum + 1;                    }                    else                    {                        startRow = sheet.FirstRowNum;                    }                    //最后一列的标号                    int rowCount = sheet.LastRowNum;                    for (int i = startRow; i <= rowCount; ++i)                    {                        Npoi.SS.UserModel.IRow row = sheet.GetRow(i);                        if (row == null || row.FirstCellNum < 0) continue; //没有数据的行默认是null                               DataRow dataRow = data.NewRow();                        for (int j = row.FirstCellNum; j < cellCount; ++j)                        {                            //同理,没有数据的单元格都默认是null                            Npoi.SS.UserModel.ICell cell = row.GetCell(j);                            if (cell != null)                            {                                if (cell.CellType == Npoi.SS.UserModel.CellType.Numeric)                                {                                    //判断是否日期类型                                    if (Npoi.SS.UserModel.DateUtil.IsCellDateFormatted(cell))                                    {                                        dataRow[j] = row.GetCell(j).DateCellValue;                                    }                                    else                                    {                                        dataRow[j] = row.GetCell(j).ToString().Trim();                                    }                                }                                else                                {                                    dataRow[j] = row.GetCell(j).ToString().Trim();                                }                            }                        }                        data.Rows.Add(dataRow);                    }                }                return data;            }            catch (Exception ex)            {                throw ex;            }        }