C# 使用NPOI手搓excel转html

/// <summary>
/// excel转html
/// </summary>
public class ExcelToHtml
{
    /// <summary>
    /// excel转html
    /// </summary>
    /// <param name="inputFilePath"></param>
    /// <param name="outputHtmlPath"></param>
    public static void ConvertExcelToHtml(string inputFilePath, string outputHtmlPath)
    {
        // 创建一个HSSFWorkbook对象来处理.xls文件,如果是.xlsx文件,则应使用XSSFWorkbook
        using (var file = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
        {
            IWorkbook workbook = null;
            try
            {
                //获取后缀名称
                string fileExt = AlphaFS.Path.GetExtension(inputFilePath)?.ToLower();
                switch (fileExt)
                {
                    //如果是XLSX格式选择XSSFWorkbook ,如果是XLS格式选择HSSFWorkbook 
                    case ".xlsx":
                        workbook = new XSSFWorkbook(file);
                        break;
                    case ".xls":
                        workbook = new HSSFWorkbook(file);
                        break;
                }
                StringBuilder htmlBuilder = new StringBuilder();
                //获取文件名称作为标题
                htmlBuilder.Append($"<html><head><title>{AlphaFS.Path.GetFileNameWithoutExtension(inputFilePath)}</title><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"></head><style>\r\n.excel-table {{\r\n        border-collapse: collapse;\r\n    }}\r\n\r\n    .excel-table tr:nth-child(odd) {{\r\n        border-bottom: 1px solid #ccc;\r\n    }}\r\n\r\n    .excel-table th, .excel-table td {{\r\n        border: 1px solid #ccc;\r\n        padding: 5px;\r\n    }}\r\n</style><body>");
                for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
                {
                    ISheet sheet = workbook.GetSheetAt(sheetIndex);
                    if (sheet == null) continue;
                    List<CellRangeAddress> mergedRegions = sheet.MergedRegions;
                    htmlBuilder.AppendFormat("<div style=\"text-align: center;\"><h1>{0}</h1></div>", sheet.SheetName);
                    htmlBuilder.Append("<table class=\"excel-table\">");
                    HashSet<string> rows = new HashSet<string>();
                    HashSet<string> cells = new HashSet<string>();
                    // 遍历行
                    for (int rowNum = sheet.FirstRowNum; rowNum <= sheet.LastRowNum; rowNum++)
                    {
                        IRow row = sheet.GetRow(rowNum);
                        if (row == null) continue;
                        if (row.ZeroHeight) { continue; }
                        bool isBlankRow = true;
                        for (int colIdx = row.FirstCellNum; colIdx < row.LastCellNum; colIdx++)
                        {
                            ICell cell = row.GetCell(colIdx, MissingCellPolicy.RETURN_BLANK_AS_NULL);
                            if (cell != null && !string.IsNullOrEmpty(cell.ToString()))
                            {
                                isBlankRow = false;
                                break;
                            }
                        }
                        if (isBlankRow) continue;
                        htmlBuilder.Append("<tr>");
                        int mergedRows = 0; // 合并行数,默认为0
                        int mergedCols = 0; // 合并列数,默认为0
                        // 遍历单元格
                        for (int cellNum = row.FirstCellNum; cellNum <= row.LastCellNum; cellNum++)
                        {
                            ICell cell = row.GetCell(cellNum);
                            if (cell == null) continue;
                            bool isHidden = cell.CellStyle.IsHidden;
                            if (isHidden) { mergedCols++; continue; };
                            // 判断单元格是否属于合并区域
                            if (mergedCols == row.LastCellNum) break; // 合并列数等于行的最后一列时,跳出循环
                            if (cells.Contains(rowNum + "-" + cellNum)) { cells.Remove(rowNum + "-" + cellNum); continue; }// 合并列数大于当前列时,跳过当前列
                            if (rows.Contains(rowNum + "-" + cellNum))
                            {
                                mergedCols++;
                                //删除rows中的数据,以免影响下次循环时间
                                rows.Remove(rowNum + "-" + cellNum);
                                continue;
                            }  //如果已经合并过则跳过(防止重复合并)

                            if (!cell.IsMergedCell)
                            {
                                htmlBuilder.AppendFormat("<td ");
                                ProcessCellStyle(htmlBuilder, cell, workbook, sheet);
                                string cellValue = GetCellValue(cell, workbook);
                                htmlBuilder.AppendFormat(">{0}</td>", WebUtility.HtmlEncode(cellValue));
                                continue;

                            }
                            foreach (var region in mergedRegions)
                            {
                                if (!region.IsInRange(rowNum, cellNum)) continue;
                                //获取合并单元格的行数和列数
                                int rowspan = region.LastRow - region.FirstRow + 1;
                                int colspan = region.LastColumn - region.FirstColumn + 1;
                                mergedCols = colspan;
                                mergedRows = rowspan;
                                //mergedCols = colspan == row.LastCellNum ? colspan : mergedCols += colspan;
                                if (mergedCols > 1&& mergedCols!= row.LastCellNum && mergedRows==1)
                                {
                                    for (int i = 0; i < mergedCols; i++)
                                    {
                                        cells.Add(rowNum + "-" + (i + cellNum));
                                    }
                                }       
                                if (mergedRows > 1)
                                {
                                    for (int i = 0; i < mergedCols; i++)
                                    {
                                        for (int j = mergedRows + rowNum - 1; j > rowNum; j--)
                                        {
                                            rows.Add(j + "-" + (i + cellNum));
                                        }
                                    }
                                }
                                htmlBuilder.AppendFormat("<td ");
                                ProcessCellStyle(htmlBuilder, cell, workbook, sheet);
                                string cellValue = GetCellValue(cell, workbook);
                                htmlBuilder.AppendFormat(" rowspan='{0}' colspan='{1}'>{2}</td>", rowspan, colspan, cellValue);
                                break;
                            }
                        }

                        htmlBuilder.Append("</tr>");
                    }

                    htmlBuilder.Append("</table>");
                }
                htmlBuilder.Append("</body></html>");
                //判断路径是否存在
                if (!AlphaFS.Directory.Exists(AlphaFS.Path.GetDirectoryName(outputHtmlPath)))
                {
                    AlphaFS.Directory.CreateDirectory(AlphaFS.Path.GetDirectoryName(outputHtmlPath));
                }
                //判断文件是否存在,存在则覆盖
                if (AlphaFS.File.Exists(outputHtmlPath))
                {
                    AlphaFS.File.Delete(outputHtmlPath);
                }
                // 将生成的HTML写入文件
                AlphaFS.File.WriteAllText(outputHtmlPath, htmlBuilder.ToString());

            }
            catch (Exception ex)

            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                workbook?.Close();
            }
        }
    }

    private static void ProcessCellStyle(StringBuilder htmlBuilder, ICell cell, IWorkbook workbook, ISheet sheet)
    {
        if (cell == null) return;
        // 获取单元格的样式
        var cellStyle = cell.CellStyle;

        // 获取字体对象
        var font = cellStyle.GetFont(workbook);

        // 获取字体大小
        var fontSize = font.FontHeightInPoints;

        // 获取字体颜色
        var fontColor = font.Color;

        // 获取背景颜色
        var backgroundColor = cellStyle.FillForegroundColorColor;

        // 将样式转换为CSS格式
        string cssStyle = $"style=\"";

        cssStyle += $"font-size: {fontSize}px;";
        // 如果设置了字体颜色,则将其转为CSS格式
        if (fontColor != null)
        {
            string fontColorHex = "#" + fontColor.ToString("X6");
            cssStyle += $" color: {fontColorHex};";
        }

        // 如果设置了背景颜色,则将其转为CSS格式
        if (backgroundColor != null)
        {

            bool isXlsx = workbook is XSSFWorkbook;
            byte[] rgb = isXlsx ? ((NPOI.XSSF.UserModel.XSSFColor)cell.CellStyle.FillForegroundColorColor).RGB : ((NPOI.HSSF.Util.HSSFColor)cell.CellStyle.FillForegroundColorColor).RGB;
            string backgroundColorHex = "#" + BitConverter.ToString(rgb).Replace("-", string.Empty);
            cssStyle += $" background-color: {backgroundColorHex};";
        }
        // 边框
        //cssStyle += "border-style: " + cellStyle.BorderTop.ToString().ToLower() + ";";
        //cssStyle += "border-color: " + "#" + cellStyle.TopBorderColor.ToString("X6") + ";";


        // 获取单元格的宽度和高度
        IRow row = sheet.GetRow(cell.RowIndex);
        float cellWidth = sheet.GetColumnWidthInPixels(cell.ColumnIndex);
        float cellHeight = row.HeightInPoints / 0.75f;

        // 将宽度和高度转换为CSS单位(像素)
        string widthCss = "width: " + cellWidth.ToString() + "px;";
        string heightCss = "height: " + cellHeight.ToString() + "px;";
        cssStyle += widthCss + heightCss;
        cssStyle += "\"";
        htmlBuilder.Append(cssStyle);
        // 输出单元格的值和样式
        Console.WriteLine($" CSSStyle: {cssStyle}");

    }

    private static string GetCellValue(ICell cell, IWorkbook workbook)
    {
        switch (cell.CellType)
        {
            case CellType.Formula:
                // 计算公式结果
                workbook.GetCreationHelper().CreateFormulaEvaluator().EvaluateInCell(cell);
                return GetCellValue(cell, workbook);
            case CellType.Numeric:
                if (DateUtil.IsCellDateFormatted(cell))
                {
                    return cell.DateCellValue.ToString("yyyy-MM-dd"); // 格式化日期
                }
                else
                {
                    return cell.NumericCellValue.ToString(); // 数字格式
                }
            case CellType.String:
                return cell.StringCellValue;
            case CellType.Boolean:
                return cell.BooleanCellValue ? "True" : "False";
            default:
                return "";
        }
    }
}


excel效果:

image.png

html效果:

image.png




本文作者:admin

本文链接:https://www.javalc.com/post/114.html

版权声明:本篇文章于2024-01-29,由admin发表,转载请注明出处:分享你我。如有疑问,请联系我们

C# Json转换DataTable
66 条评论
  • 游客  2024-07-07  回复
  • 最近回了很多帖子,都没人理我!http://7q8fe.ml03.cn
  • 游客  2024-07-07  回复
  • 无图无真相!http://fu2.x856.cn
  • 游客  2024-07-07  回复
  • 很多天不上线,一上线就看到这么给力的帖子!http://onwus.e8jes3c.cn
  • 游客  2024-07-07  回复
  • 知识就是力量啊!http://bro.tzpvzvs.cn
  • 游客  2024-07-07  回复
  • 很经典,收藏了!http://w4a61q.yipin112.com.cn
  • 游客  2024-07-07  回复
  • 每天顶顶贴,一身轻松啊!http://oc55v1.dpgljks.cn
  • 游客  2024-07-07  回复
  • 有内涵!http://o53azh.kblewwq.cn
  • 游客  2024-07-07  回复
  • 顶顶更健康!http://0v2jug.lqbsxaf.cn
  • 游客  2024-07-07  回复
  • 这么经典的话只有楼主能想到!http://ng9ic3.830x.cn
  • 游客  2024-07-08  回复
  • 看了这么多帖子,第一次看到这么有深度了!http://e2a.zhengshanwang.cn
  • 游客  2024-07-08  回复
  • 收藏了,楼主加油!http://frsiyi.chaoyaoji.com
  • 游客  2024-07-08  回复
  • 这个帖子会火的,鉴定完毕!http://g5v8fx.china-beili.com
  • 游客  2024-07-08  回复
  • 楼主练了葵花宝典吧?http://y7416.china-beili.com
  • 游客  2024-07-08  回复
  • 投楼主一票,不用谢哦!http://j2ul.xunmiai.com
  • 游客  2024-07-08  回复
  • 感谢楼主的推荐!http://bvl.xunmiai.com
  • 游客  2024-07-08  回复
  • 收藏了,怕楼主删了!http://zvos.xunmiai.com
  • 游客  2024-07-08  回复
  • 太邪乎了吧?http://9188b.xunmiai.com
  • 游客  2024-07-08  回复
  • 很有品味!http://8mjo14.tiantianzhoupeng.com
  • 游客  2024-07-08  回复
  • 信楼主,考试不挂科!http://g6d.tiantianzhoupeng.com
  • 游客  2024-07-08  回复
  • 感谢楼主的推荐!http://tpu2p.tiantianzhoupeng.com
  • 游客  2024-07-08  回复
  • 学习雷锋,好好回帖!http://8yh18.zhengshanwang.cn
  • 游客  2024-07-09  回复
  • 不错哦,楼主这是要火的节奏啊!https://www.ejy365.com/jygg_more
  • 游客  2024-07-09  回复
  • 有钱、有房、有车,人人都想!http://www.2qukuai.com/category-11.html
  • 游客  2024-07-09  回复
  • 楼上的很有激情啊!http://w7yo6v.whxf-pack.com
  • 游客  2024-07-09  回复
  • 哥回复的不是帖子,是寂寞!http://va8z.adsofts.cn
  • 游客  2024-07-09  回复
  • 收藏了,很不错的内容!http://szauu.mrs-jio.com
  • 游客  2024-07-09  回复
  • 楼主很有艺术范!http://30ct.adsofts.cn
  • 游客  2024-07-09  回复
  • 好东西,赞一个!http://y30.adsofts.cn
  • 游客  2024-07-09  回复
  • 青春不在了,青春痘还在!http://4zj244.zypottery.com
  • 游客  2024-07-09  回复
  • 世界末日我都挺过去了,看到楼主我才知道为什么上帝留我到现在!http://r94d.adsofts.cn
  • 游客  2024-07-09  回复
  • 好无聊啊!http://dsl.whxf-pack.com
  • 游客  2024-07-09  回复
  • 楼主练了葵花宝典吧?http://k9sey.qdhnst.com/6/5.html
  • 游客  2024-07-09  回复
  • 我只是来赚积分的!http://ees.jnmcwx.com
  • 游客  2024-07-09  回复
  • 怎么我回帖都没人理我呢?http://ybjf.statconuter.com
  • 游客  2024-07-09  回复
  • 语言表达流畅,没有冗余,读起来很舒服。http://eqxxn.healthreportz.com/c/3.html
  • 游客  2024-07-10  回复
  • 看了这么多帖子,第一次看到这么有深度了!http://xyoalc.eklaser.cn
  • 游客  2024-07-10  回复
  • 不灌水就活不下去了啊!http://rlhj.eklaser.cn
  • 游客  2024-07-10  回复
  • 勤奋灌水,天天向上!http://zrd6ug.zypottery.com
  • 游客  2024-07-10  回复
  • 鉴定完毕!http://6x9na.whxf-pack.com
  • 游客  2024-07-10  回复
  • 灌水不是我的目的!http://ofgf5.mrs-jio.com
  • 游客  2024-07-10  回复
  • 学习雷锋,好好回帖!http://5z40u.adsofts.cn
  • 游客  2024-07-10  回复
  • 小弟默默的路过贵宝地~~~http://uc7lu0.zypottery.com
  • 游客  2024-07-10  回复
  • 今天的心情很不错啊http://3o0h.gz-chuangli.com
  • 游客  2024-07-10  回复
  • 楼主很有艺术范!http://v1ek8.whxf-pack.com
  • 游客  2024-07-10  回复
  • 我和我的小伙伴都惊呆了!http://bm8.eklaser.cn
  • 游客  2024-07-10  回复
  • 楼主的头像是本人吗?http://vba300.gz-chuangli.com
  • 游客  2024-07-10  回复
  • 这一年啥事没干,光研究楼主的帖子了!http://xcygf.cn/html/81c099801.html
  • 游客  2024-07-10  回复
  • 东方不败还是灭绝师太啊?http://vn3q.wpcuntao.com
  • 游客  2024-07-10  回复
  • 我回帖楼主给加积分吗?http://l9s.kblewwq.cn
  • 游客  2024-07-10  回复
  • 刚看见一个妹子,很漂亮!http://iing1e.sudubesi.com
  • 游客  2024-07-11  回复
  • 楼主练了葵花宝典吧?http://cpj5m.12123123.com/J/3.html
  • 游客  2024-07-11  回复
  • 东方不败还是灭绝师太啊?http://tq8fp.12123123.com/07/5.html
  • 游客  2024-07-11  回复
  • 楼上的能详细介绍一下么?http://t0n11t.jindetai.cn
  • 游客  2024-07-11  回复
  • 楼主该去看心理医生了!http://ltt.jindetai.cn
  • 游客  2024-07-11  回复
  • 这个帖子会火的,鉴定完毕!http://490gw1.sudubesi.com
  • 游客  2024-07-11  回复
  • 经典,收藏了!http://phj.b-autorental.com.cn
  • 游客  2024-07-11  回复
  • 楼主今年多大了?http://18n.gz-chuangli.com
  • 游客  2024-07-11  回复
  • 支持一下!http://43w.gz-chuangli.com
  • 游客  2024-07-11  回复
  • 青春不在了,青春痘还在!http://cdyb8i.gz-chuangli.com
  • 游客  2024-07-11  回复
  • 我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://1xt.b-autorental.com.cn
  • 游客  2024-07-11  回复
  • 每天顶顶贴,一身轻松啊!http://1sl59.sudubesi.com
  • 游客  2024-07-11  回复
  • 看了这么多帖子,第一次看到这么有深度了!http://9o6.shxclp.com
  • 游客  2024-07-11  回复
  • 刚分手,心情不好!http://73lh.shxclp.com
  • 游客  2024-07-11  回复
  • 顶一个!http://yv68af.eklaser.cn
  • 游客  2024-07-11  回复
  • 楼主的帖子实在是写得太好了。文笔流畅,修辞得体!http://7uq7.shxclp.com
  • 游客  2024-07-11  回复
  • 今天上网不回帖,回帖就回精华帖!https://www.ejy365.com/info/ejy184210

发表评论

取消
扫码支持