首页 > 编程语言 >c# 文件在线预览功能

c# 文件在线预览功能

时间:2023-07-20 15:55:38浏览次数:26  
标签:HTML return 在线 预览 c# System html using string

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Drawing;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using OfficeOpenXml;
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using HtmlAgilityPack;


namespace FilePreview.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PreviewController : ControllerBase
    {
        static PreviewController()
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        }

        /// <summary>
        /// 预览Excel
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> PreviewExcel(string filePath)
        {
            //需要安装一个名为"EPPlus"的NuGet包
            try
            {
                using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(filePath)))
                {
                    DataSet dataSet = new DataSet();

                    foreach (ExcelWorksheet worksheet in excelPackage.Workbook.Worksheets)
                    {
                        System.Data.DataTable dataTable = new System.Data.DataTable(worksheet.Name);
                        for (int col = 1; col <= worksheet.Dimension.Columns; col++)
                        {
                            string columnName = worksheet.Cells[1, col].Value?.ToString();
                            dataTable.Columns.Add(columnName);
                        }
                        for (int row = 2; row <= worksheet.Dimension.Rows; row++)
                        {
                            DataRow dataRow = dataTable.NewRow();
                            for (int col = 1; col <= worksheet.Dimension.Columns; col++)
                            {
                                object cellValue = worksheet.Cells[row, col].Value;
                                dataRow[col - 1] = cellValue;
                            }
                            dataTable.Rows.Add(dataRow);
                        }
                        dataSet.Tables.Add(dataTable);
                    }
                    string json = JsonConvert.SerializeObject(dataSet);
                    return Ok(json);
                }
            }
            catch (System.Exception ex)
            {
                return Ok(ex.Message);
            }

        }


        /// <summary>
        /// 预览word
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> PreviewWord(string filePath)
        {
            //需要安装一个名为"Open XML SDK"的NuGet包
            try
            {
                // 打开 Word 文档
                using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, false))
                {
                    // 获取文档主体部分
                    MainDocumentPart mainPart = doc.MainDocumentPart;
                    Document document = mainPart.Document;
                    Body body = document.Body;

                    string html = "<html><body>";
                    // 遍历文档中的所有段落
                    foreach (DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph in body.Elements<DocumentFormat.OpenXml.Wordprocessing.Paragraph>())
                    {
                        // 将段落转换为 HTML
                        string paragraphHtml = ConvertParagraphToHtml(paragraph, mainPart);

                        // 添加段落 HTML 到总体 HTML 字符串中
                        html += paragraphHtml;
                    }

                    html += "</body></html>";

                    return Ok(html);
                }
            }
            catch (System.Exception ex)
            {
                return Ok(ex.Message);
            }
        }
        private static string ConvertParagraphToHtml(DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph, MainDocumentPart mainPart)
        {
            string html = "<p>";

            // 遍历段落中的所有运行
            foreach (DocumentFormat.OpenXml.Wordprocessing.Run run in paragraph.Elements<DocumentFormat.OpenXml.Wordprocessing.Run>())
            {
                // 遍历运行中的所有图片
                foreach (DocumentFormat.OpenXml.Wordprocessing.Drawing drawing in run.Elements<DocumentFormat.OpenXml.Wordprocessing.Drawing>())
                {
                    // 获取图片的嵌入对象
                    Blip blip = drawing.Descendants<Blip>().FirstOrDefault();
                    if (blip != null)
                    {
                        // 获取图片的 ID
                        string imageId = blip.Embed.Value;

                        // 获取与图片关联的图像部分
                        ImagePart imagePart = (ImagePart)mainPart.GetPartById(imageId);

                        // 将图像部分的内容转换为 Base64 字符串
                        string base64String = ConvertImagePartToBase64(imagePart);

                        // 构建 <img> 标签
                        string imgTag = $"<img src=\"data:image/png;base64,{base64String}\" alt=\"Image\" />";

                        // 添加到段落 HTML 中
                        html += imgTag;
                    }
                }

                // 获取运行的文本内容
                //string text = run.InnerText;

                string text = ConvertWordXmlToHtml(run.InnerText,run.InnerXml);
                // 添加文本内容到段落 HTML 中
                html += text;
            }

            html += "</p>";

            return html;
        }
        private static string ConvertImagePartToBase64(ImagePart imagePart)
        {
            using (Stream stream = imagePart.GetStream())
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    stream.CopyTo(memoryStream);
                    byte[] imageBytes = memoryStream.ToArray();
                    return Convert.ToBase64String(imageBytes);
                }
            }
        }
        public static string ConvertWordXmlToHtml(string text,string wordXml)
        {
            // 创建 HTML 文档对象
            HtmlDocument htmlDoc = new HtmlDocument();
            htmlDoc.OptionAutoCloseOnEnd = true;

            // 创建 <span> 元素并设置样式
            var spanNode = htmlDoc.CreateElement("span");

            var family = Substr(wordXml, "w:ascii=\"");
            var size = "12";
            int number;
            if (int.TryParse(Substr(wordXml, "w:val=\""), out number)) {
                size = (int.Parse(Substr(wordXml, "w:val=\"")) / 2).ToString();
            }
            var style = "font-family: " + family + "; font-size: " + size + "px;";
            spanNode.SetAttributeValue("style", style);

            // 将文本内容添加到 <span> 元素中
            var textNode = htmlDoc.CreateTextNode(text);
            spanNode.AppendChild(textNode);

            // 将 <span> 元素添加到 HTML 文档中
            htmlDoc.DocumentNode.AppendChild(spanNode);

            // 将 HTML 文档转换为字符串
            using (var writer = new System.IO.StringWriter())
            {
                htmlDoc.Save(writer);
                return writer.ToString();
            }
        }
        public static string Substr(string originalString, string substring)
        {
            // 查找子字符串的索引
            int startIndex = originalString.IndexOf(substring);

            if (startIndex != -1)
            {
                // 截取子字符串后的一部分字符串
                string remainingString = originalString.Substring(startIndex + substring.Length);

                // 查找第一个引号的索引
                int endIndex = remainingString.IndexOf('"');

                if (endIndex != -1)
                {
                    // 利用 Substring 方法截取第一个引号之前的值
                    string result = remainingString.Substring(0, endIndex);
                    return result;
                }
            }
            return "";
        }
    }
}

 

 

方法调用

Excel文件预览:https://localhost:44368/api/Preview/PreviewExcel?filePath=C:\Users\Administrator\Desktop\001.xlsx
返回一个json结构的dataset 

Word文件预览:https://localhost:44368/api/Preview/PreviewWord?filePath=C:\Users\Administrator\Desktop\002.docx
返回一个前端的html页面

 

标签:HTML,return,在线,预览,c#,System,html,using,string
From: https://www.cnblogs.com/zj19940610/p/17568625.html

相关文章

  • 使用navicat连接非默认端口的数据库
    使用navicat连接非默认端口的数据库有时候数据库服务器端口不是默认的1521、1433、3306等端口时,我们要如何通过Navicat连接它们呢?很简单,只需要在ip地址后面加“,端口号”即可......
  • MySQL中IF函数使用:字段A的返回值,根据字段B和C的条件来决定
     场景说明:车辆的位置信息是否返回,根据车辆位置的更新时间是否大于车辆的出站时间来决定;如果车辆位置的更新时间大于车辆的出站时间,则为有效的数据,直接返回经纬度数据;否则,视为无效的数据,直接返回NULL。下面是SQL语句的片段:-------------------------------------------------......
  • gRPC如何保障数据安全传输
    什么是gRPC?gRPC是由Google开发的高性能、开源的RPC(RemoteProcedureCall)框架,用于在客户端和服务器之间进行通信。它基于ProtocolBuffers(protobuf)进行消息序列化和反序列化,支持多种通信协议,如HTTP/2、TCP和gRPC提供的协议。gRPC的安全需求在现代网络环境中,数据的安......
  • Affinity Photo - 图片编辑软件mac/win版
    AffinityPhoto是一款功能强大的图片编辑软件,它提供了广泛而全面的工具和功能,使用户能够对照片进行高质量的编辑和后期处理。→→↓↓载AffinityPhotomac/win版 用户友好的界面:AffinityPhoto采用了直观而现代化的用户界面,使用户能够轻松找到和使用各种工具和选项。无......
  • javascript中json 对象 数组之间相互转化的示例
    在JavaScript中,你可以使用JSON.stringify()将JSON对象转换为JSON字符串,使用JSON.parse()将JSON字符串转换为JSON对象。而要将JSON对象转换为数组,可以使用Object.values()方法,而要将数组转换为JSON对象,可以使用Array.reduce()方法。下面是这些转换的示例代码:将JSON对象转换为JSON......
  • Affinity Designer - 矢量图设计软件mac/win版
    AffinityDesigner是一款专业的矢量图设计软件,它提供了强大的工具和功能,使用户能够创建精确、高质量的矢量图形和图标。→→↓↓载AffinityDesignermac/win版 用户友好的界面:AffinityDesigner采用了直观而现代化的用户界面,使用户能够方便地使用各种工具和选项。无论是......
  • HPC 算力测试
     #安装前配置curl168.7.10.2:8000/local.repo>/etc/yum.repos.d/kylin_aarch64.repoyuminstall-ylibatomicenvironment-modulesvimnfs-utils&>/dev/nullmkdir-p/workspacemount168.10.1.20:/workspace/workspace#加载环境变量cat>/etc/profile.d/hpc.sh<......
  • PeacefulTeams
    [ABC310D]PeacefulTeams考虑状压DP。令\(f[i][S'][S]\)表示已经分配到了第\(i\)组,且该组的人集合为\(S'\),分配过的人集合为\(S\)方案数。假设加入一个人\(j\),则\(f[i][S'][S]->f[i][S'|j][S|j]\)(当然需要满足一定条件)或者加入之后新分了一组,则\(f[i][S'][S]->f[i+......
  • 英文fc6下的中文问题
     fc6安装时只安装了英文,为了加入中文显示的支持,在fc6的安装盘dvd中找到kde-i18n-Chinese-3.5.4-1.noarch.rpm和kde-i18n-Chinese-Big5-3.5.4-1.noarch.rpm,注意,其他的语言支持也是类似名称的包。中文输入问题:......
  • fc6的硬盘安装
    搞了几天,才算搞定,主要参考下文,我下的文件是dvd.iso。放在H盘(hd0,8)。将grub的相关文件放在c,相关位置指向hd0,8。titleFC6    root(hd0,8)    kernel/isolinux/vmlinuz    initrd/isolinux/initrd.imghttp://blog.sina.com......