¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog v-model="dialogVisible" title="é¢è§" width="100%" fullscreen align-center :before-close="handleClose" append-to-body> |
| | | <div> |
| | | <!-- å¾çé¢è§ --> |
| | | <div v-if="isImage"> |
| | | <img :src="imgUrl" alt="Image Preview" /> |
| | | </div> |
| | | |
| | | <!-- PDFé¢è§æç¤º --> |
| | | <div v-if="isPdf" style="height: 100vh; display: flex; align-items: center; justify-content: center;"> |
| | | <p>æ£å¨åå¤PDFé¢è§...</p> |
| | | </div> |
| | | |
| | | <!-- Wordææ¡£é¢è§ --> |
| | | <div v-if="isDoc"> |
| | | <p v-if="!isDocShow">ææ¡£æ æ³ç´æ¥é¢è§ï¼è¯·ä¸è½½æ¥çã</p> |
| | | <a :href="fileUrl" v-if="!isDocShow">ä¸è½½æä»¶</a> |
| | | <vue-office-docx |
| | | v-else |
| | | :src="fileUrl" |
| | | style="height: 100vh;" |
| | | @rendered="renderedHandler" |
| | | @error="errorHandler" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- Excelææ¡£é¢è§ --> |
| | | <div v-if="isXls"> |
| | | <p v-if="!isDocShow">ææ¡£æ æ³ç´æ¥é¢è§ï¼è¯·ä¸è½½æ¥çã</p> |
| | | <a :href="fileUrl" v-if="!isDocShow">ä¸è½½æä»¶</a> |
| | | <vue-office-excel |
| | | v-else |
| | | :src="fileUrl" |
| | | :options="options" |
| | | style="height: 100vh;" |
| | | @rendered="renderedHandler" |
| | | @error="errorHandler" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- å缩æä»¶å¤ç --> |
| | | <div v-if="isZipOrRar"> |
| | | <p>å缩æä»¶æ æ³ç´æ¥é¢è§ï¼è¯·ä¸è½½æ¥çã</p> |
| | | <a :href="fileUrl">ä¸è½½æä»¶</a> |
| | | </div> |
| | | |
| | | <!-- 䏿¯æçæ ¼å¼ --> |
| | | <div v-if="!isSupported"> |
| | | <p>䏿¯æçæä»¶æ ¼å¼</p> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, getCurrentInstance, watch } from 'vue'; |
| | | import VueOfficeDocx from '@vue-office/docx'; |
| | | import '@vue-office/docx/lib/index.css'; |
| | | import VueOfficeExcel from '@vue-office/excel'; |
| | | import '@vue-office/excel/lib/index.css'; |
| | | |
| | | // ååºå¼åé |
| | | const fileUrl = ref('') |
| | | const dialogVisible = ref(false) |
| | | const { proxy } = getCurrentInstance(); |
| | | const javaApi = proxy.javaApi; |
| | | |
| | | // ææ¡£é¢è§ç¶æ |
| | | const isDocShow = ref(true); |
| | | const imgUrl = ref(''); |
| | | const options = ref({ |
| | | xls: false, |
| | | minColLength: 0, |
| | | minRowLength: 0, |
| | | widthOffset: 10, |
| | | heightOffset: 10, |
| | | beforeTransformData: (workbookData) => workbookData, |
| | | transformData: (workbookData) => workbookData, |
| | | }); |
| | | |
| | | // 计ç®å±æ§ - 夿æä»¶ç±»å |
| | | const isImage = computed(() => { |
| | | const state = /\.(jpg|jpeg|png|gif)$/i.test(fileUrl.value); |
| | | if (state) { |
| | | imgUrl.value = fileUrl.value.replaceAll('word', 'img'); |
| | | } |
| | | return state; |
| | | }); |
| | | |
| | | const isPdf = computed(() => { |
| | | console.log(fileUrl.value) |
| | | return /\.pdf$/i.test(fileUrl.value); |
| | | }); |
| | | |
| | | const isDoc = computed(() => { |
| | | return /\.(doc|docx)$/i.test(fileUrl.value); |
| | | }); |
| | | |
| | | const isXls = computed(() => { |
| | | const state = /\.(xls|xlsx)$/i.test(fileUrl.value); |
| | | if (state) { |
| | | options.value.xls = /\.(xls)$/i.test(fileUrl.value); |
| | | } |
| | | return state; |
| | | }); |
| | | |
| | | const isZipOrRar = computed(() => { |
| | | return /\.(zip|rar)$/i.test(fileUrl.value); |
| | | }); |
| | | |
| | | const isSupported = computed(() => { |
| | | return isImage.value || isPdf.value || isDoc.value || isXls.value || isZipOrRar.value; |
| | | }); |
| | | |
| | | // 卿å建aæ ç¾å¹¶è·³è½¬é¢è§PDF |
| | | const previewPdf = (url) => { |
| | | // å建aæ ç¾ |
| | | const link = document.createElement('a'); |
| | | // 设置PDFæä»¶URL |
| | | link.href = url; |
| | | // 卿°æ ç¾é¡µæå¼ |
| | | link.target = '_blank'; |
| | | // å®å
¨å±æ§ï¼é²æ¢æ°é¡µé¢è®¿é®åé¡µé¢ |
| | | link.rel = 'noopener noreferrer'; |
| | | // å¯éï¼è®¾ç½®é¾æ¥ææ¬ |
| | | link.textContent = 'é¢è§PDF'; |
| | | // å°aæ ç¾æ·»å å°é¡µé¢ï¼é¨åæµè§å¨è¦æ±å¿
é¡»å¨DOMä¸ï¼ |
| | | document.body.appendChild(link); |
| | | // 触åç¹å»äºä»¶ |
| | | link.click(); |
| | | // ç§»é¤aæ ç¾ï¼æ¸
çDOM |
| | | document.body.removeChild(link); |
| | | }; |
| | | |
| | | |
| | | // çå¬PDFç¶æååï¼èªå¨è§¦å跳转 |
| | | watch( |
| | | () => isPdf.value, |
| | | (newVal) => { |
| | | |
| | | // å½ç¡®è®¤æ¯PDF䏿件URLæææ¶ |
| | | if (newVal && fileUrl.value) { |
| | | // å
³éå¯¹è¯æ¡ |
| | | dialogVisible.value = false; |
| | | // å 个å°å»¶è¿ç¡®ä¿ç¶ææ´æ°å®æ |
| | | setTimeout(() => { |
| | | previewPdf(fileUrl.value); |
| | | fileUrl.value = ''; |
| | | }, 100); |
| | | } |
| | | } |
| | | ); |
| | | |
| | | // æ¹æ³å®ä¹ |
| | | const renderedHandler = () => { |
| | | console.log("渲æå®æ"); |
| | | isDocShow.value = true; |
| | | resetStyle(); |
| | | }; |
| | | |
| | | const errorHandler = () => { |
| | | console.log("渲æå¤±è´¥"); |
| | | isDocShow.value = false; |
| | | }; |
| | | |
| | | const open = (url) => { |
| | | fileUrl.value = window.location.protocol+'//'+window.location.host+ url; |
| | | dialogVisible.value = true; |
| | | }; |
| | | const handleClose = () => { |
| | | dialogVisible.value = false; |
| | | }; |
| | | |
| | | const resetStyle = () => { |
| | | const elements = document.querySelectorAll('[style*="pt"]'); |
| | | for (const element of elements) { |
| | | const style = element.getAttribute('style'); |
| | | if (style) { |
| | | element.setAttribute('style', style.replace(/pt/g, 'px')); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // æ´é²openæ¹æ³ä¾å¤é¨è°ç¨ |
| | | defineExpose({ |
| | | open |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped> |
| | | img { |
| | | max-width: 100%; |
| | | display: block; |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .oneLine { |
| | | overflow: hidden; |
| | | white-space: nowrap; |
| | | text-overflow: ellipsis; |
| | | } |
| | | </style> |