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页面

c# 文件在线预览功能的更多相关文章

  1. kkFileView对接svn服务完成文件在线预览功能

    1.需求: 之前在公司内部搭建了svn服务器,给部门存放文档.视频,做成了一个文档服务器来用,随着视频文件太大,每次下载太慢 需要把文件在线打开查看 2.解决: kkFileView https:// ...

  2. svn服务支持网页显示并增加在线预览功能,支持视频在线播放

    1.svn服务器支持网页显示 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便.不过,它本身并没有提供在线修改密码的功能.由于在实际使用过程中, ...

  3. Java实现office文档与pdf文档的在线预览功能

    最近项目有个需求要java实现office文档与pdf文档的在线预览功能,刚刚接到的时候就觉得有点难,以自己的水平难以在三四天做完.压力略大.后面查找百度资料.以及在同事与网友的帮助下,四天多把它做完 ...

  4. Java实现在线预览功能

    java实现在线预览功能,需要用到  jacob.dll jacob.jar   预览pdf所需js  pdfobject.min.js 将上传文件转为pdf保存. <div class=&qu ...

  5. pdf文件在线预览

    使用pdfjs技术实现PDF的在线预览功能. 目录 1.官网下载pdf.js 2. 将下载下来的文件全部复制 3. js使用 4. java IO流 1.官网下载pdf.js 2. 将下载下来的文件全 ...

  6. 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程

    大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...

  7. asp.net word ecxel类型文件在线预览

    asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...

  8. 使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误

    首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 <iframe src="<c:url value="js/gen ...

  9. 文件在线预览doc,docx转换pdf(一)

    文件在线预览doc,docx转换pdf(一) 1. 前言 文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库 ...

  10. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

随机推荐

  1. 如何玩转国产神器:接口一体化协作平台Apifox!

    前言:Apifox是什么? 简介: 简单来说,Apifox = swagger + mock + postman+Jmeter,是API 文档.API 调试.API Mock.API 自动化测试一体化 ...

  2. Karmada v1.5发布:多调度组助力成本优化

    摘要:在最新发布的1.5版本中,Karmada 提供了多调度组的能力,利用该能力,用户可以实现将业务优先调度到成本更低的集群,或者在主集群故障时,优先迁移业务到指定的备份集群. 本文分享自华为云社区& ...

  3. “露天煤矿现场调研和交流案例分享”在CSDN发表,两次审核未通过,判定:全篇涉及广告

    我在博客园发布了:露天煤矿现场调研和交流案例分享.后台分享到了CSDN,结果判定为:全篇涉及广告.我要是真能写出来全篇涉及广告的文章,也算我能力比较强,就算是让ChatGPT可能也写不出来吧. 这种坐 ...

  4. ROS机器人摄像头寻线

    ROS机器人摄像头寻线 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 开启摄像头 ...

  5. OpenAI的离线音频转文本模型 Whisper 的.NET封装项目

    whisper介绍 Open AI在2022年9月21日开源了号称其英文语音辨识能力已达到人类水准的Whisper神经网络,且它亦支持其它98种语言的自动语音辨识. Whisper系统所提供的自动语音 ...

  6. Python 变量作用域和列表

    变量作用域 变量由作用范围限制 分类:按照作用域分类 全局(global):在函数外部定义 局部(local):在函数内部定义 变量的作用范围: 全局变量:在整个全局范围有效 全局碧昂量在局部可以使用 ...

  7. Locust 任务类介绍

    前言: 任务:简单的理解就是,你想要你脚本的虚拟用户去做哪些事,比如请求某一个接口,或者执行某一个事件 用户:可以理解为,执这个任务的实例主体,或者在locust 中,也可以认为是一群蝗虫 一.Tas ...

  8. Microsoft Loop初体验

    目前AI copilot无法使用. 问题 图片 在设置中可以打开实验选项 简单开箱使用 很多人说微软的loop竞品是notion,那么作为卡片盒双链笔记软件,最热门的应用当然是notion.从loop ...

  9. 今日分享:目前目标责任成本明细单价已设置,机构参数设置-物资合同单价超目标责任成本明细单价Y%时不能保存,该参数已设置但未生效是为什么?

    在编制的时候-"材料类别设置"中,不勾选"管控".

  10. 用go设计开发一个自己的轻量级登录库/框架吧(项目维护篇)

    用go设计开发一个自己的轻量级登录库/框架吧(项目维护篇) 本篇将开始讲讲开发库/框架的最开始阶段,也就是搭建一个项目 源码:weloe/token-go: a light login library ...