index.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <a-spin tip="" size="small" :spinning="spinning">
  3. <a-button type="link" size="small" @click="loadFile">预览</a-button>
  4. </a-spin>
  5. <a-modal :visible="visible" :ok-button-props="{ style: { display: 'none' } }"
  6. wrap-class-name="full-modal" style="text-align: center"
  7. cancel-text="关闭" @cancel="visible = !visible">
  8. <a-spin tip="加载中..." size="small" :spinning="spinning">
  9. <vue-office-excel v-if="fileSuffix=='xlsx'" :src="previewUrl" style="height: 90vh;"
  10. @rendered="rendered" @error="renderedError"/>
  11. <vue-office-pdf v-else-if="fileSuffix=='xls'" :src="previewUrl" class="docx-calss" @rendered="rendered"
  12. @error="renderedError" style="height: 90vh;"/>
  13. <vue-office-docx v-else-if="fileSuffix=='docx'||fileSuffix=='doc'" :src="previewUrl" @rendered="rendered"
  14. @error="renderedError"
  15. style="width: 100%; height: 90vh;"/>
  16. <vue-office-pdf v-else :src="previewUrl" class="docx-calss" @rendered="rendered"
  17. @error="renderedError" style="height: 90vh;"/>
  18. </a-spin>
  19. </a-modal>
  20. </template>
  21. <script lang="ts">
  22. import {defineComponent, ref} from 'vue';
  23. import {message as $message} from "ant-design-vue/lib/components";
  24. //引入VueOfficeDocx组件
  25. import VueOfficeDocx from '@vue-office/docx'
  26. import '@vue-office/docx/lib/index.css'
  27. import VueOfficePdf from '@vue-office/pdf'
  28. //引入VueOfficeExcel组件
  29. import VueOfficeExcel from '@vue-office/excel'
  30. import '@vue-office/excel/lib/index.css'
  31. import {handleloadByGet} from "@/utils/downloadFile";
  32. export default defineComponent({
  33. name: 'b-file-preview',
  34. components: {
  35. VueOfficeDocx, VueOfficePdf, VueOfficeExcel
  36. },
  37. props: {
  38. fileName: {type: String, default: ""},
  39. filePath: {type: String, default: ""},
  40. accept: {
  41. type: String,
  42. default: '.docx,.doc,.xlsx,.xls,.pdf',
  43. },
  44. },
  45. setup(props) {
  46. const visible = ref<boolean>(false);
  47. const spinning = ref<boolean>(false);
  48. const previewUrl = ref<Blob>();
  49. const fileSuffix = ref("");
  50. function loadFile() {
  51. let fileName = stripHtmlTags(props.fileName);
  52. let filePath = stripHtmlTags(props.filePath);
  53. fileSuffix.value = fileName?.substring(fileName?.lastIndexOf('.') + 1).toLowerCase();
  54. debugger
  55. if (props.accept?.indexOf(fileSuffix.value) < 0) {
  56. $message.error("不支持预览的文件格式!");
  57. return;
  58. }
  59. spinning.value = true;
  60. handleloadByGet("/api/wellInfo/downFile", {
  61. isShow: 1,
  62. fileName: fileName,
  63. filePath: filePath
  64. }, "获取文件失败!").then(res => {
  65. previewUrl.value = res.data;
  66. if (previewUrl.value == undefined) {
  67. $message.error("文件加载失败!");
  68. return;
  69. }
  70. visible.value = true;
  71. })
  72. }
  73. function stripHtmlTags(htmlString: string): string {
  74. return htmlString.replace(/<[^>]+>/g, '');
  75. }
  76. function rendered() {
  77. console.log("渲染完成");
  78. spinning.value = false;
  79. }
  80. function renderedError(ex) {
  81. console.log("渲染出错", ex);
  82. spinning.value = false;
  83. }
  84. return {
  85. visible, fileSuffix,
  86. previewUrl,
  87. loadFile,
  88. rendered, renderedError,
  89. spinning,
  90. };
  91. }
  92. })
  93. </script>
  94. <style lang="less">
  95. </style>