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预览代码片段如 ...
随机推荐
- Midjourney 提示词工具(10 个国内外最好最推荐的)
Midjourney,是一个革命性的基于人工智能的艺术生成器,可以从被称为提示的简单文本描述中生成令人惊叹的图像.Midjourney已经迅速成为艺术家.设计师和营销人员的首选工具(包括像我这样根本不 ...
- MacOS 环境下 VSCode 的 C++ 环境搭建
编译器安装 编译器可以选择 Clang 或者 GCC,在 MacOS 上 Clang 的安装更为简单一些. Clang(推荐) 打开终端输入命令, clang -v 查看是否已经安装. 如果已经安装, ...
- RMQ问题ST表
稀疏表(Sparse Table表) 解决静态RMQ,区间最值查询问题的数据结构,树状数组(BIT)解决动态前缀和问题的数据结构: 例:https://www.luogu.org/problemnew ...
- 2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k
2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false. 1 <= n, q <= 1 ...
- 基于.NetCore开发博客项目 StarBlog - (28) 开发友情链接相关接口
前言 之前介绍的友情链接功能,只实现了友情链接的展示和管理接口. 还缺失友情链接申请.审核管理.通知,现在把这块功能补全. Model 什么的之前那篇文章都有,本文直接补全逻辑代码~ 详见: 基于.N ...
- 快速上手kettle(三)壶中可以放些啥?
目录 序言 一 .kettle这壶能装些啥 二.Access输入 2.1 准备Acess数据库和表 2.2 新建一个转换并设置 2.3 启动转换预览数据 三.CSV文件输入 3.1 准备csv文件,并 ...
- 网站开发[1] - Spring Boot 快速建立项目
前言 学校的数据库课程要求做出前端页面对数据库进行交互, 可以使用 Python 或者 Java 语言作为后端, Python语言使用起来非常方便, 但出于对自己的挑战以及更加贴合实际企业开发, 我选 ...
- 【技术积累】Python中的NumPy库【一】
NumPy库是什么 NumPy是Python科学计算的核心库之一,用来进行科学计算,数值分析等矩阵运算.主要提供了以下几种功能: 1.多维数组(ndarray)对象,可以进行快速的数值计算和数组操作: ...
- P8933 [JRKSJ R7] 技巧性的块速递推 题解
题目传送门 题意: 简单来说就是一个涂色游戏. 有一个 n×m 的棋盘需要涂色. 每格只能涂黑色或白色两种颜色. 横.竖.斜连续 3 格颜色不能相同. 横.竖.斜连续 4 格颜色不能有 3 个相同颜色 ...
- 体验了一把 MiniGPT-4,一言难尽
最近看到一个好玩的开源项目:MiniGPT-4. 看名字像 GPT-4 的小老弟,其实没啥关系. 简单说,它可以识别图像,基于图像你可以和它对话,它能生成图片描述.网站.诗歌. 先看看官方给出的例子截 ...