Exreport.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <el-form label-position="left">
  3. <!-- <span>导出格式</span> -->
  4. <el-form-item label="导出格式" :label-width="formLabelWidth">
  5. </el-form-item>
  6. <el-radio-group v-model="exformat">
  7. <el-radio label="2">doc</el-radio>
  8. <el-radio label="1">pdf</el-radio>
  9. <el-radio label="3">HTML</el-radio>
  10. <el-radio label="4">image</el-radio>
  11. </el-radio-group>
  12. <!-- <div style="text-align: center;width: 100%;">
  13. <el-transfer
  14. v-model="selectedvalue"
  15. :data="tranlist"
  16. class="custom_transfer"
  17. />
  18. </div> -->
  19. <!-- <el-form-item label="选择文件:" :label-width="formLabelWidth">
  20. <el-row style="width: 100%">
  21. <el-col :span="24">
  22. <el-input
  23. readonly
  24. />
  25. </el-col>
  26. <el-col :span="1" style="display: flex; align-items: center; margin-left: -35px">
  27. <fileUploads
  28. :projectId="123"
  29. solverType="exampleSolver"
  30. accept=""
  31. upId="uniqueId1"
  32. name="点击选择文件"
  33. :imgSrc="meshFileImgSrc"
  34. />
  35. </el-col>
  36. </el-row>
  37. </el-form-item>
  38. <div>
  39. <el-checkbox-group>
  40. <el-checkbox label="表1" value="表1"/>
  41. <el-checkbox label="表1" value="表1"/>
  42. <el-checkbox label="表1" value="表1"/>
  43. <el-checkbox label="表1" value="表1"/>
  44. </el-checkbox-group>
  45. </div>
  46. <el-form-item label="选择名称:" :label-width="formLabelWidth">
  47. <el-row>
  48. <el-col span="20">
  49. <el-input></el-input>
  50. </el-col>
  51. <el-col span="4">
  52. <el-button>打开</el-button>
  53. </el-col>
  54. </el-row>
  55. </el-form-item>
  56. <el-form-item label="文件类型:" :label-width="formLabelWidth">
  57. <el-select v-model="selflietype">
  58. <el-option
  59. v-for = "item in flietypelist"
  60. :key="item.value"
  61. :label="item.label"
  62. :value="item.value"
  63. />
  64. </el-select>
  65. </el-form-item> -->
  66. </el-form>
  67. </template>
  68. <script setup>
  69. import { ref, onMounted, reactive, provide, nextTick } from "vue"
  70. import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
  71. import { Edit, CaretBottom } from "@element-plus/icons-vue"
  72. import { requestblobfile, uploadFile } from "@/utils/request"
  73. import fileUploads from "../components/fileuploads.vue";
  74. const meshFileImgSrc = new URL("@/assets/img/open.png", import.meta.url).href;
  75. let formLabelWidth = ref(90)
  76. let pid = ref()
  77. let exformat = ref('2')
  78. let selectedvalue = ref([])
  79. let selflietype = ref('Adobe PDF(*.pdf)')
  80. let tranlist = ref([
  81. { key: '1', label: '表1' },
  82. { key: '2', label: '表1' },
  83. { key: '3', label: '表1' },
  84. { key: '4', label: '表1' },
  85. ])
  86. let flietypelist = ref([
  87. { label:"Adobe PDF(*.pdf)", value:"pdf" },
  88. { label:"Word 97-2003 Document(*.doc)", value:"doc" },
  89. { label:"HTML(*.html)", value:"html" },
  90. { label:"All Image Files(*.png,*.jpg,*.jpeg,*.gif)", value:"img" },
  91. ])
  92. const exportreport = (id) => {
  93. pid.value = id;
  94. const params = {
  95. transCode: "MDO0082",
  96. pid: pid.value,
  97. type: exformat.value
  98. };
  99. requestblobfile(params)
  100. .then(res => {
  101. // 1. 获取服务器返回的文件名(从 Content-Disposition)
  102. const contentDisposition = res.headers['content-disposition'];
  103. let fileName = `报告_${pid.value}.docx`; // 默认文件名(如果解析失败)
  104. if (contentDisposition) {
  105. const fileNameMatch = contentDisposition.match(/filename=(.+)/i);
  106. if (fileNameMatch && fileNameMatch[1]) {
  107. fileName = fileNameMatch[1].trim(); // 提取服务器返回的文件名
  108. }
  109. }
  110. // 2. 获取正确的 MIME 类型(从 Content-Type)
  111. const contentType = res.headers['content-type'] || 'application/octet-stream';
  112. // 3. 创建 Blob 并下载
  113. const blob = new Blob([res.data], { type: contentType });
  114. const link = document.createElement('a');
  115. const blobUrl = URL.createObjectURL(blob);
  116. link.href = blobUrl;
  117. link.download = fileName; // 使用服务器返回的文件名
  118. document.body.appendChild(link);
  119. link.click();
  120. // 清理资源
  121. URL.revokeObjectURL(blobUrl);
  122. document.body.removeChild(link);
  123. })
  124. .catch(err => {
  125. ElMessage.error('导出报告失败');
  126. console.error('导出错误:', err);
  127. });
  128. };
  129. defineExpose({
  130. exportreport
  131. })
  132. </script>