c# 文件在线预览功能
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# 文件在线预览功能的更多相关文章
- kkFileView对接svn服务完成文件在线预览功能
1.需求: 之前在公司内部搭建了svn服务器,给部门存放文档.视频,做成了一个文档服务器来用,随着视频文件太大,每次下载太慢 需要把文件在线打开查看 2.解决: kkFileView https:// ...
- svn服务支持网页显示并增加在线预览功能,支持视频在线播放
1.svn服务器支持网页显示 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便.不过,它本身并没有提供在线修改密码的功能.由于在实际使用过程中, ...
- Java实现office文档与pdf文档的在线预览功能
最近项目有个需求要java实现office文档与pdf文档的在线预览功能,刚刚接到的时候就觉得有点难,以自己的水平难以在三四天做完.压力略大.后面查找百度资料.以及在同事与网友的帮助下,四天多把它做完 ...
- Java实现在线预览功能
java实现在线预览功能,需要用到 jacob.dll jacob.jar 预览pdf所需js pdfobject.min.js 将上传文件转为pdf保存. <div class=&qu ...
- pdf文件在线预览
使用pdfjs技术实现PDF的在线预览功能. 目录 1.官网下载pdf.js 2. 将下载下来的文件全部复制 3. js使用 4. java IO流 1.官网下载pdf.js 2. 将下载下来的文件全 ...
- 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程
大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...
- asp.net word ecxel类型文件在线预览
asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...
- 使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误
首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 <iframe src="<c:url value="js/gen ...
- 文件在线预览doc,docx转换pdf(一)
文件在线预览doc,docx转换pdf(一) 1. 前言 文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库 ...
- 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html
#网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...
随机推荐
- Java开发准备
1.Java是一门面向对象的高级语言 JDK:是java development kit的缩写,意思是java程序开发的工具包. 可以用来开发Java和运行Java程序 JRE:Java Runtim ...
- Abp框架Web站点的安全性提升
本文将从GB/T 28448-2019<信息安全技术 网络安全等级保护测评要求>规定的安全计算环境中解读.摘要若干安全要求,结合Abp框架,对站点进行安全升级. [身份鉴别]应对登录的用户 ...
- [操作系统] - 进程状态&进程描述
2.1 进程(Process) 2.1.1 定义 chatGPT版:一个具有独立功能的程序关于某个数据集合的一次运行活动 人话版:程序在并发环境中的执行过程& 进程是程序的一次执行 2.1.2 ...
- 一文教你如何使用Node进程管理工具-pm2
pm2 是什么 pm2 是一个守护进程管理工具,它能帮你守护和管理你的应用程序.通常一般会在服务上线的时候使用 pm2 进行管理.pm2 能做的其实有很多,比如监听文件改动自动重启,统一管理多个进程, ...
- Linux 根据名称自动kill掉当前相关进程
ps aux | grep app | grep -v "grep" | awk '{print $2}' | xargs -r kill
- BUG解决-Vscode/Sublime C++ 打印中文乱码问题
#include <iostream> using namespace std; #ifdef _WIN32 #include <windows.h> #endif int m ...
- 大米cms爆破后台及支付逻辑漏洞
又找到个网站挖洞,我来康康. 大米手机是个什么鬼手机??看一下吧 这个支付页面好熟悉,可能存在支付逻辑漏洞,咱们用burp改个包看看. 先支付一个看看 把包里那个=1改成0试试~ 证实确实存在支付逻辑 ...
- 2021-10-22:颠倒二进制位。颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不
2021-10-22:颠倒二进制位.颠倒给定的 32 位无符号整数的二进制位.提示:请注意,在某些语言(如 Java)中,没有无符号整数类型.在这种情况下,输入和输出都将被指定为有符号整数类型,并且不 ...
- @csrf_exempt
在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问.那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一:在类的 disp ...
- Github Copilot Chat 初体验
最近因为阳了的缘故一直躺在床上.今天终于从床上爬起来了.不是因为好透了,而是因为我收到了申请Copilot Chat preview 权限通过的邮件.实在忍不住,于是起床开电脑在咳嗽声中进行了一番体验 ...