使用Vue 3实现Word模板上传、解析和打印功能的完整解决方案:
一、实现步骤
- 安装依赖
- 创建文件上传组件
- 实现.docx文件解析
- 创建打印预览组件
- 实现打印功能
- 样式优化
二、完整代码实现
1. 安装依赖
npm install mammoth axios
2. 创建文件上传组件(FileUpload.vue)
<template><div class="upload-container"><!-- 文件上传区域 --><input type="file" ref="fileInput"accept=".docx"@change="handleFileUpload"class="upload-input"/><button @click="triggerFileInput" class="upload-button">选择Word模板</button><!-- 错误提示 --><div v-if="errorMessage" class="error-message">{{ errorMessage }}</div></div>
</template><script>
import mammoth from 'mammoth';export default {emits: ['upload-success'],data() {return {errorMessage: ''};},methods: {// 触发文件选择对话框triggerFileInput() {this.$refs.fileInput.click();},// 处理文件上传async handleFileUpload(event) {const file = event.target.files[0];this.errorMessage = '';// 校验文件类型if (!file || !file.name.endsWith('.docx')) {this.errorMessage = '仅支持.docx格式文件';return;}try {// 使用Mammoth解析Word文档const result = await mammoth.convertToHtml({ arrayBuffer: await file.arrayBuffer() });// 发出解析后的HTML内容和原始文件this.$emit('upload-success', {htmlContent: result.value,originalFile: file});} catch (error) {console.error('文件解析失败:', error);this.errorMessage = '文件解析失败,请检查文件格式';}}}
}
</script><style scoped>
.upload-container {margin: 20px;padding: 15px;border: 1px dashed #ccc;
}.upload-input {display: none;
}.upload-button {padding: 8px 15px;background: #409eff;color: white;border: none;border-radius: 4px;cursor: pointer;
}.error-message {color: #f56c6c;margin-top: 10px;
}
</style>
3. 创建打印预览组件(PrintPreview.vue)
<template><div class="print-preview"><!-- 预览区域 --><div class="preview-content" v-html="processedContent"></div><!-- 操作按钮 --><div class="action-buttons"><button @click="printDocument" class="print-button">打印文档</button></div></div>
</template><script>
export default {props: {htmlContent: {type: String,required: true}},computed: {// 处理HTML内容(可添加自定义处理)processedContent() {return this.htmlContent;}},methods: {// 打印文档printDocument() {const printWindow = window.open('', '_blank');printWindow.document.write(`<html><head><title>打印文档</title><style>/* 打印样式优化 */@media print {body { margin: 0; }img { max-width: 100%; }table { width: 100%; border-collapse: collapse; }}</style></head><body>${this.processedContent}</body></html>`);printWindow.document.close();printWindow.print();}}
}
</script><style scoped>
.preview-content {max-width: 800px;margin: 20px auto;padding: 20px;border: 1px solid #ddd;background: white;
}.action-buttons {text-align: center;margin-top: 20px;
}.print-button {padding: 10px 20px;background: #67c23a;color: white;border: none;border-radius: 4px;cursor: pointer;
}
</style>
4. 主组件集成(App.vue)
<template><div class="app-container"><h1>Word模板打印系统</h1><FileUpload @upload-success="handleUploadSuccess" /><PrintPreview v-if="showPreview":html-content="templateContent"/></div>
</template><script>
import FileUpload from './components/FileUpload.vue';
import PrintPreview from './components/PrintPreview.vue';export default {components: {FileUpload,PrintPreview},data() {return {templateContent: '',showPreview: false};},methods: {handleUploadSuccess({ htmlContent }) {this.templateContent = htmlContent;this.showPreview = true;}}
}
</script><style>
.app-container {max-width: 1200px;margin: 0 auto;padding: 20px;font-family: Arial, sans-serif;
}
</style>
三、使用说明
1. 功能特性
- 支持.docx文件上传
- 实时预览转换后的内容
- 打印样式优化
- 错误处理机制
2. 使用流程
- 点击"选择Word模板"按钮
- 选择.docx格式文件
- 自动显示转换后的预览内容
- 点击"打印文档"按钮进行打印
3. 注意事项
- 仅支持.docx格式(Word 2007+)
- 文档中的图片将被转换为Base64嵌入
- 建议文档宽度不超过800px
- 复杂表格样式建议使用CSS增强
四、扩展建议
1. 样式增强
/* 在PrintPreview组件中添加 */
.preview-content {font-family: 'SimSun'; /* 使用打印常用字体 */line-height: 1.6;
}.preview-content table {border: 1px solid #000;
}.preview-content td, .preview-content th {padding: 8px;border: 1px solid #ddd;
}
2. 服务端集成(可选)
// 如果需要保存模板
async saveTemplate() {try {await axios.post('/api/templates', {content: this.templateContent,fileName: this.uploadedFileName});} catch (error) {console.error('保存失败:', error);}
}
3. 水印功能(示例)
// 在printDocument方法中添加
const watermark = `<div style="position: absolute;opacity: 0.2;transform: rotate(-45deg);font-size: 48px;color: #666;">机密文档</div>
`;printWindow.document.body.innerHTML = watermark + this.processedContent;
该方案实现了完整的Word模板上传、解析和打印流程,包含完善的错误处理和样式优化,可直接集成到现有Vue项目中。可根据具体需求扩展模板管理、样式配置等功能。