C# 把Excel转换成Table

本文介绍了一个将Excel文件转换为DataTable的函数,处理不同版本Excel、指定sheet和列数,支持日期格式识别。核心内容涉及数据读取、格式转换和异常处理。
#region Excel转换成Table
        /// <summary>
        /// Excel转换成Table
        /// </summary>
        /// <param name="fileNameurl"></param>
        /// <param name="sheetName"></param>
        /// <param name="ColumnNum"></param>
        /// <returns></returns>
        public static DataTable ExcelToDataTableHelper(string fileNameurl, string sheetName, int ColumnNum)
        {
            ISheet sheet = null;
            DataTable data = new DataTable();
            int startRow = 0;
            try
            {
                fs = new FileStream(fileNameurl, FileMode.Open, FileAccess.Read);
                if (fileNameurl.IndexOf(".xlsx") > 0) // 2007版本
                    workbook = new XSSFWorkbook(fs);
                else if (fileNameurl.IndexOf(".xls") > 0) // 2003版本
                    workbook = new HSSFWorkbook(fs);

                if (sheetName != null)
                {
                    sheet = workbook.GetSheet(sheetName);
                    if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
                    {
                        sheet = workbook.GetSheetAt(0);
                    }
                }
                else
                {
                    sheet = workbook.GetSheetAt(0);
                }
                if (sheet != null)
                {
                    IRow firstRow;

                    // firstRow = sheet.GetRow(0);
                    if (ColumnNum > 0)
                    {
                        firstRow = sheet.GetRow(ColumnNum - 1);
                    }
                    else
                    {
                        firstRow = sheet.GetRow(0);
                    }
                    int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数

                    for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                    {
                        ICell cell = firstRow.GetCell(i);
                        if (cell != null)
                        {
                            string cellValue = cell.StringCellValue;
                            if (cellValue != null && cellValue != "")
                            {
                                DataColumn column = new DataColumn(cellValue);
                                data.Columns.Add(column);
                            }
                        }
                    }
                    cellCount = data.Columns.Count;

                    //找出第几行是列名
                    startRow = ColumnNum;

                    //startRow = firstDataNum-1;
                    //最后一列的标号
                    int rowCount = sheet.LastRowNum;
                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        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();
                                //读取Excel格式,根据格式读取数据类型
                                ICell cell = row.GetCell(j);
                                dataRow[j] = parseExcel(cell);
                            }
                        }
                        data.Rows.Add(dataRow);
                    }
                }
                return data;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return null;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
        }

        private static String parseExcel(ICell cell)
        {
            string result = "";
            switch (cell.CellType)
            {
                case CellType.Formula:
                    HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);
                    result = e.Evaluate(cell).StringValue;
                    break;
                case CellType.Numeric:// 数字类型
                    if (HSSFDateUtil.IsCellDateFormatted(cell))
                    {// 处理日期格式、时间格式
                        string sdf = "";
                        if (cell.CellStyle.DataFormat == HSSFDataFormat
                                .GetBuiltinFormat("h:mm"))
                        {
                            sdf = "HH:mm";
                        }
                        else
                        {// 日期
                            sdf = "yyyy-MM-dd";
                        }
                        DateTime date = cell.DateCellValue;
                        result = date.ToString(sdf);
                    }
                    else if (cell.CellStyle.DataFormat == 58)
                    {
                        // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
                        string sdf = "yyyy-MM-dd";
                        double value = cell.NumericCellValue;
                        DateTime date = new DateTime(1899, 12, 30); // 起始时间
                        date = date.AddDays(value);
                        result = date.ToString(sdf);
                    }
                    else
                    {
                        result = cell.NumericCellValue.ToString();
                    }
                    break;
                case CellType.String:// String类型
                    result = cell.StringCellValue;
                    break;
                case CellType.Blank:
                    result = "";
                    break;
                default:
                    result = "";
                    break;
            }
            return result;
        }
        #endregion
C#中,将Excel转换为PDF通常需要借助第三方库,因为.NET Framework本身并不包含直接将Excel转换为PDF的功能。一个常用的库是EPPlus,它用于读取和操作Excel文件,而iTextSharp或者NReco.PdfGenerator等可以用来生成PDF。 以下是一个基本的步骤,使用EPPlus读取Excel,然后使用iTextSharp创建PDF: 1. 安装必要的NuGet包: - EPPlus: `Install-Package EPPlus` - iTextSharp: `Install-Package iTextSharp` 2. 首先,通过EPPlus打开Excel文件并获取数据: ```csharp using OfficeOpenXml; ... var excelPackage = new ExcelPackage(new FileInfo("input.xlsx")); var worksheet = excelPackage.Workbook.Worksheets[0]; var dataRange = worksheet.Cells["A1"].CurrentRegion; // 假设数据在A1区域 DataTable dataTable = dataRange.GetValues<DataRow>(); ``` 3. 使用iTextSharp创建PDF文档,并添加数据: ```csharp using iTextSharp.text; using iTextSharp.text.pdf; ... byte[] pdfBytes; using (var ms = new MemoryStream()) { var document = new Document(); PdfWriter.GetInstance(document, ms); document.Open(); foreach (DataRow row in dataTable.Rows) { var cellValues = row.ItemArray; PdfPTable table = new PdfPTable(dataRange.Columns.Count); for (int i = 0; i < dataRange.Columns.Count; i++) { table.AddCell(cellValues[i].ToString()); } document.Add(table); } document.Close(); pdfBytes = ms.ToArray(); } ``` 4. 写入PDF文件或返回字节流: ```csharp File.WriteAllBytes("output.pdf", pdfBytes); // 或者返回给客户端或存储到数据库 ``` 注意这只是一个基础示例,实际应用中可能需要处理更复杂的数据格式、表头、页眉页脚等问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值