文件预览(pdf word excel ppt等)

前提:都是通过接口获取到的文件流,然后通过以上window.URL.createObjectURL方法将转成url传给组件

  1. @cyntler/react-doc-viewer

通过支持的文件类型可知word、excel、ppt类的有局限性

  1. react-file-viewer
  • docx的文件支持预览,无局限性
  • 应该是xlsx吧? 它的官网写的是xslx,但是无法预览
  1. docx-preview

这个预览docx的效果比react-file-viewer要好

  1. react-excel-renderer

支持xlsx、xls、csv

此组件不能直接用于预览,而是拿到文件信息,将其转成二维数组,手动进行渲染,代码如下:

js 复制代码
import React, { useEffect, useState } from 'react'
import { ExcelRenderer } from 'react-excel-renderer'

export default function ExcelViewer(file) {
  const [rows, setRows] = useState([])
  const [cols, setCols] = useState([])

  const handleFile = (file) => {
    ExcelRenderer(file, (err, resp) => {
      if (err) {
        console.error(err)
      } else {
        setCols(resp.cols)
        setRows(resp.rows)
      }
    })
  }

  useEffect(() => {
    if (file) {
      handleFile(file.file)
    }
  }, [file])

  return (
    <div>
      {rows.length > 0 && (
        <div style={{ overflowX: 'auto', marginTop: '20px' }}>
          <table style={{ borderCollapse: 'collapse', width: '100%' }}>
            <thead>
              <tr>
                {cols.map((col, index) => (
                  <th key={index} style={{ border: '1px solid #ddd', padding: '8px' }}>
                    {col.name}
                  </th>
                ))}
              </tr>
            </thead>
            <tbody>
              {rows.map((row, rowIndex) => (
                <tr key={rowIndex}>
                  {row.map((cell, cellIndex) => (
                    <td key={cellIndex} style={{ border: '1px solid #ddd', padding: '8px' }}>
                      {cell}
                    </td>
                  ))}
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      )}
    </div>
  )
}

弊端:样式不空,对于合并单元格以及一些内部样式(链接、字体等)无法进行拿到其信息,也就无法渲染,只能是简单的显示内容,如下图

  1. pptx2html

ppt的预览无法直接通过纯前端实现,可以采用前后端结合的方式实现,后端通过nodeJs + pptx2html,将ppt文件转成html,返回给前端进行渲染

后端示例(Node.js + pptx2html)

js 复制代码
const express = require('express');
const pptx2html = require('pptx2html');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/api/parse-pptx', upload.single('pptx'), async (req, res) => {
  const result = await pptx2html(req.file.path);
  res.json(result.slides);
});

前端示例

jsx 复制代码
function PPTXViewer() {
  const [slides, setSlides] = useState([]);

  const handleUpload = async (e) => {
    const file = e.target.files[0];
    if (!file) return;

    const formData = new FormData();
    formData.append('pptx', file);

    const response = await fetch('/api/parse-pptx', {
      method: 'POST',
      body: formData
    });
    setSlides(await response.json());
  };

  return (
    <div>
      <input type="file" accept=".pptx" onChange={handleUpload} />
      {slides.map((slide, index) => (
        <div key={index} dangerouslySetInnerHTML={{ __html: slide.html }} />
      ))}
    </div>
  );
}
  1. ppt的可以换个思路:ppt转pdf,然后再预览,这样前端可以实现

总结:

pdf:支持

word:仅支持docx

excel: 支持,但是样式有问题

ppt:支持

相关推荐
康小汪9 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南10 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
白山编程大哥11 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt12 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn13 小时前
bundle优化
前端
北冥有鱼13 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚13 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户372037492601813 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能14 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师14 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端