当前位置:   article > 正文

vue +elementui 导入CSV文件

vue +elementui 导入CSV文件

 

目录

1. 安装依赖

2. 封装一个公共js方法,使用papaparse解析CSV文件且返回数组格式

3. html页面

4. 案例图


1. 安装依赖

cnpm i papaparse -s

cnpm i  jschardet -s

2. 封装一个公共js方法,使用papaparse解析CSV文件且返回数组格式

  1. import jschardet from 'jschardet'
  2. import Papa from 'papaparse'
  3. /**
  4. * csv file to 2D arr
  5. * */
  6. // 检查编码,引用了 jschardet
  7. function checkEncoding(base64Str) {
  8. // 这种方式得到的是一种二进制串
  9. var str = atob(base64Str.split(';base64,')[1])
  10. // console.log(str);
  11. // 要用二进制格式
  12. var encoding = jschardet.detect(str)
  13. encoding = encoding.encoding
  14. // console.log( encoding );
  15. if (encoding === 'windows-1252') { // 有时会识别错误(如UTF8的中文二字)
  16. encoding = 'ANSI'
  17. }
  18. return encoding
  19. }
  20. function csv(file) {
  21. return new Promise((resolve, reject) => {
  22. // let file = this.$refs.csvData.files[0]
  23. const fReader = new FileReader()
  24. fReader.readAsDataURL(file)
  25. fReader.onload = function (evt) {
  26. const data = evt.target.result
  27. // console.log( data );
  28. const encoding = checkEncoding(data)
  29. // console.log(encoding);
  30. // 转换成二维数组,需要引入Papaparse.js
  31. Papa.parse(file, {
  32. encoding: encoding,
  33. complete: function (results) { // UTF8 \r\n与\n混用时有可能会出问题
  34. // console.log(results)
  35. const res = results.data
  36. if (res[res.length - 1] === '') { // 去除最后的空行
  37. res.pop()
  38. }
  39. resolve(res)
  40. }
  41. })
  42. }
  43. })
  44. }
  45. export default {
  46. csv
  47. }

3. html页面

ps: 里面有导入的一部分代码,不需要就删除即可。

  1. <template>
  2. <div class="testIndex">
  3. <el-row>
  4. <el-col :span="12"> <el-button
  5. @click="outBtn"
  6. type="success"
  7. >导出</el-button></el-col>
  8. <el-col :span="12">
  9. <el-upload
  10. class="upload-demo"
  11. action=""
  12. :on-change="handleChange"
  13. :file-list="fileListUpload"
  14. accept=".csv"
  15. :auto-upload="false"
  16. >
  17. <el-button
  18. size="small"
  19. type="primary"
  20. >点击上传</el-button>
  21. </el-upload>
  22. </el-col>
  23. </el-row>
  24. <el-table
  25. :data="tableData"
  26. border
  27. style="width: 50%"
  28. :header-cell-style="{background:'#EEF6FD',color:'#251E25'}"
  29. slot="empty"
  30. >
  31. <el-table-column
  32. prop="number"
  33. label="#"
  34. width="50%"
  35. align="center"
  36. ></el-table-column>
  37. <el-table-column
  38. prop="name"
  39. label="字段名"
  40. align="center"
  41. ></el-table-column>
  42. <el-table-column
  43. prop="nameRemark"
  44. label="备注名"
  45. align="center"
  46. ></el-table-column>
  47. <el-table-column
  48. prop="index"
  49. label="索引字段"
  50. align="center"
  51. ></el-table-column>
  52. </el-table>
  53. <!-- 弹框 -->
  54. <el-dialog
  55. title="数据导出"
  56. :visible.sync="dialogVisible1"
  57. width="30%"
  58. >
  59. <el-form
  60. :model="exportForm"
  61. ref="exportForm"
  62. label-position="right"
  63. >
  64. <el-form-item
  65. label="导出格式"
  66. prop="exportFormat"
  67. >
  68. <el-select
  69. v-model="exportForm.exportFormat"
  70. placeholder="请选择"
  71. >
  72. <el-option
  73. label="CSV"
  74. value="0"
  75. ></el-option>
  76. <el-option
  77. label="XML"
  78. value="1"
  79. ></el-option>
  80. <el-option
  81. label="HTML"
  82. value="2"
  83. ></el-option>
  84. <el-option
  85. label="PDF"
  86. value="3"
  87. ></el-option>
  88. <el-option
  89. label="Excel"
  90. value="4"
  91. ></el-option>
  92. </el-select>
  93. </el-form-item>
  94. </el-form>
  95. <div
  96. slot="footer"
  97. class="dialog-footer"
  98. >
  99. <el-button @click="handleClose">取 消</el-button>
  100. <el-button
  101. type="primary"
  102. @click="handleExprotData"
  103. >确 定</el-button>
  104. </div>
  105. </el-dialog>
  106. </div>
  107. </template>
  108. <script>
  109. import { exportCsv } from "@/utils/testUtils";
  110. import csv2arr from "@/assets/csv-arr";
  111. export default {
  112. data() {
  113. return {
  114. dialogVisible1: false,
  115. exportForm: {
  116. id: "",
  117. exportFormat: "",
  118. },
  119. tableData: [
  120. // { id: 1, name: "XXX公司", test1: "测试11", test2: "测试22" },
  121. // { id: 2, name: "sdfds", test1: "测试11-2", test2: "测试22-2" },
  122. // { id: 3, name: "sff胜多负少", test1: "测试11-3", test2: "测试22-3" },
  123. // { id: 4, name: "儿童", test1: "测试11-4", test2: "测试22-4" },
  124. ],
  125. fileTemp: null,
  126. fileListUpload: [],
  127. fileList: [],
  128. };
  129. },
  130. methods: {
  131. handleClose() {
  132. this.dialogVisible1 = false;
  133. this.exportForm = {
  134. id: "",
  135. exportFormat: "",
  136. };
  137. },
  138. // 导出按钮,导出时触发弹窗
  139. outBtn() {
  140. this.dialogVisible1 = true;
  141. },
  142. //#region 导出功能
  143. handleExprotData() {
  144. //表头
  145. let allColumns = [
  146. { title: "名称", key: "name" },
  147. { title: "测试1", key: "test1" },
  148. { title: "测试2", key: "test2" },
  149. ];
  150. let checkboxList = [
  151. { id: 1, name: "XXX公司", test1: "测试11", test2: "测试22" },
  152. { id: 2, name: "sdfds", test1: "测试11-2", test2: "测试22-2" },
  153. { id: 3, name: "sff胜多负少", test1: "测试11-3", test2: "测试22-3" },
  154. { id: 4, name: "儿童", test1: "测试11-4", test2: "测试22-4" },
  155. ];
  156. //this.checkboxList是勾选的需要导出的数据
  157. console.log("allColumns------", allColumns);
  158. console.log("checkboxList----", checkboxList);
  159. this.exportForm.exportFormat == 0 &&
  160. exportCsv(allColumns, checkboxList, "测试Csv");
  161. },
  162. //#endregion
  163. //#region 导入
  164. handleChange(file, fileList) {
  165. this.fileTemp = file.raw;
  166. if (this.fileTemp) {
  167. if (
  168. this.fileTemp.type == ".csv" ||
  169. this.fileTemp.type == "application/vnd.ms-excel"
  170. ) {
  171. this.importcsv(file.raw);
  172. } else {
  173. this.$message({
  174. type: "warning",
  175. message: "附件格式错误,请删除后重新上传!",
  176. });
  177. }
  178. } else {
  179. this.$message({
  180. type: "warning",
  181. message: "请上传附件!",
  182. });
  183. }
  184. },
  185. importcsv(obj) {
  186. let _this = this; //如果需要点击事件结束之后对DOM进行操作使用)_this.xx=xx进行操作
  187. console.log("obj===", obj);
  188. //
  189. let data = [];
  190. csv2arr.csv(obj).then((res) => {
  191. console.log("我的数据", res);
  192. //遍历csv文件中的数据,存放到data中 方法不唯一,可自己更改
  193. for (let i = 0; i < res.length - 1; i++) {
  194. let obj = {};
  195. obj.number = res[i][0];
  196. obj.name = res[i][1];
  197. obj.nameRemark = res[i][2];
  198. obj.index = res[i][3];
  199. data.push(obj);
  200. }
  201. console.log("截取第一位之前的数据==", data);
  202. data.splice(0, 1); //将数组第一位的表格名称去除
  203. let num = 0;
  204. console.log("2024-4-1data==", data);
  205. _this.tableData = data; //将数据放入要展示的表格中
  206. });
  207. },
  208. //#endregion
  209. // csv() {
  210. // csv2arr.csv(this.$refs.csvData.files[0]).then((res)=>{
  211. // console.log('我的数据', res)
  212. // })
  213. // }
  214. },
  215. };
  216. </script>

4. 案例图

 ps:目前这个只适用于CSV文件

案例成果
csv文件
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读