index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. <input type="file" @change="changeHandle"/>
  9. <a-spin tip="加载中..." size="small" :spinning="spinning">
  10. <vue-office-excel v-if="fileSuffix=='xlsx'" :src="previewUrl" style="height: 90vh;"
  11. @rendered="rendered" @error="renderedError"/>
  12. <vue-office-pdf v-else-if="fileSuffix=='xls'" :src="previewUrl" class="docx-calss" @rendered="rendered"
  13. @error="renderedError" style="height: 90vh;"/>
  14. <vue-office-docx v-else-if="fileSuffix=='docx'||fileSuffix=='doc'" :src="previewUrl" @rendered="rendered"
  15. @error="renderedError"
  16. style="width: 100%; height: 90vh;"/>
  17. <vue-office-pdf v-else :src="previewUrl" class="docx-calss" @rendered="rendered"
  18. @error="renderedError" style="height: 90vh;"/>
  19. </a-spin>
  20. </a-modal>
  21. </template>
  22. <script lang="ts">
  23. import {defineComponent, ref} from 'vue';
  24. import {message as $message} from "ant-design-vue/lib/components";
  25. //引入VueOfficeDocx组件
  26. import VueOfficeDocx from '@vue-office/docx'
  27. import '@vue-office/docx/lib/index.css'
  28. import VueOfficePdf from '@vue-office/pdf'
  29. //引入VueOfficeExcel组件
  30. import VueOfficeExcel from '@vue-office/excel'
  31. import '@vue-office/excel/lib/index.css'
  32. import {handleloadByGet} from "@/utils/downloadFile";
  33. export default defineComponent({
  34. name: 'b-file-preview',
  35. components: {
  36. VueOfficeDocx, VueOfficePdf, VueOfficeExcel
  37. },
  38. props: {
  39. fileName: {type: String, default: ""},
  40. filePath: {type: String, default: ""},
  41. accept: {
  42. type: String,
  43. default: '.docx,.doc,.xlsx,.xls,.pdf',
  44. },
  45. },
  46. setup(props) {
  47. const visible = ref<boolean>(false);
  48. const spinning = ref<boolean>(false);
  49. const previewUrl = ref<any>();
  50. const fileSuffix = ref("");
  51. function loadFile() {
  52. let fileName = stripHtmlTags(props.fileName);
  53. let filePath = stripHtmlTags(props.filePath);
  54. fileSuffix.value = fileName?.substring(fileName?.lastIndexOf('.') + 1).toLowerCase();
  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. debugger
  66. previewUrl.value = new Blob([res.data], {type: "application/octet-stream"});
  67. // previewUrl.value = res.data;
  68. if (previewUrl.value == undefined) {
  69. $message.error("文件加载失败!");
  70. return;
  71. }
  72. visible.value = true;
  73. })
  74. }
  75. function changeHandle(event) {
  76. let file = event.target.files[0]
  77. let fileReader = new FileReader()
  78. fileReader.readAsArrayBuffer(file)
  79. fileReader.onload = () => {
  80. previewUrl.value = fileReader.result;
  81. }
  82. }
  83. function stripHtmlTags(htmlString: string): string {
  84. return htmlString.replace(/<[^>]+>/g, '');
  85. }
  86. function rendered() {
  87. console.log("渲染完成");
  88. spinning.value = false;
  89. }
  90. function renderedError(ex) {
  91. console.log("渲染出错", ex);
  92. spinning.value = false;
  93. }
  94. return {
  95. visible, fileSuffix,
  96. previewUrl,
  97. loadFile,
  98. rendered, renderedError,changeHandle,
  99. spinning,
  100. };
  101. }
  102. })
  103. </script>
  104. <style lang="less">
  105. </style>