Implementierung des Imports und Exports von Vue-Element-Admin-Projekten

Implementierung des Imports und Exports von Vue-Element-Admin-Projekten

vue-element-admin importiert Komponentenkapselung

Vorlagen und Stile

Bildbeschreibung hier einfügen

Kapseln Sie zunächst eine ähnliche Komponente. Zunächst ist zu beachten, dass ähnliche Funktionen bereits von vue-element-admin bereitgestellt werden. Wir müssen es nur ändern.
Die Excel-Importfunktion erfordert die Verwendung des NPM-Pakets xlsx, daher müssen Sie das xlsx-Plugin installieren

npm und xlsx

Erstellen Sie eine neue Komponente mit der Importfunktion von vue-element-admin, Speicherort: src/components/UploadExcel

Importieren Sie CommonTools aus „./CommonTools“.
UploadExcel aus „./UploadExcel“ importieren
Standard exportieren {
  installieren(Vue) {
    Vue.component('CommonTools', CommonTools) // Symbolleistenkomponente registrieren Vue.component('UploadExcel', UploadExcel) // Importierte Excel-Komponente registrieren }
}

Stil und Layout ändern

<Vorlage>
  <div Klasse="Upload-Excel">
    <div Klasse="btn-upload">
      <el-button :loading="wird geladen" size="mini" type="primary" @click="handleUpload">
        Zum Hochladen klicken</el-button>
    </div>

    <input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick">
    <div Klasse="drop" @drop="handleDrop" @dragover="handleDragover" @dragenter="handleDragover">
      <i Klasse="el-icon-upload" />
      <span>Dateien hierher ziehen</span>
    </div>
  </div>
</Vorlage>

<Skript>
XLSX aus „xlsx“ importieren

Standard exportieren {
  Requisiten: {
    beforeUpload: Funktion, // eslint-disable-line
    onSuccess: Funktion // eslint-disable-line
  },
  Daten() {
    zurückkehren {
      wird geladen: falsch,
      excelDaten: {
        Header: null,
        Ergebnisse: null
      }
    }
  },
  Methoden: {
    generateData({ header, results }) {
      this.excelData.header = Kopfzeile
      this.excelData.results = Ergebnisse
      dies.beiErfolg und dies.beiErfolg(diese.excelData)
    },
    handleDrop(e) {
      e.stopPropagation()
      e.preventDefault()
      wenn (dieses.laden) return
      const-Dateien = e.dataTransfer.files
      if (Dateien.Länge !== 1) {
        this.$message.error('Unterstützt nur das Hochladen einer Datei!')
        zurückkehren
      }
      const rawFile = files[0] // nur files[0] verwenden

      wenn (!dies.istExcel(rawFile)) {
        this.$message.error('Unterstützt nur das Hochladen von Dateien mit den Suffixen .xlsx, .xls und .csv')
        return false
      }
      dies.upload(Rohdatei)
      e.stopPropagation()
      e.preventDefault()
    },
    handleDragover(e) {
      e.stopPropagation()
      e.preventDefault()
      e.dataTransfer.dropEffect = "Kopieren"
    },
    Hochladen mit Handle() {
      dies.$refs['excel-upload-input'].click()
    },
    handleKlick(e) {
      const-Dateien = e.target.files
      const rawFile = files[0] // nur files[0] verwenden
      wenn (! Rohdatei) return
      dies.upload(Rohdatei)
    },
    hochladen(Rohdatei) {
      this.$refs['excel-upload-input'].value = null // Fix: kann nicht das gleiche Excel auswählen

      wenn (!this.beforeUpload) {
        dies.readerData(Rohdatei)
        zurückkehren
      }
      const vorher = this.beforeUpload(rawFile)
      wenn (vor) {
        dies.readerData(Rohdatei)
      }
    },
    Leserdaten(Rohdatei) {
      dies.laden = wahr
      returniere neues Promise((lösen, ablehnen) => {
        const reader = neuer FileReader()
        reader.onload = e => {
          const data = e.ziel.ergebnis
          const workbook = XLSX.read(Daten, { Typ: 'Array' })
          const firstSheetName = workbook.SheetNames[0]
          const worksheet = workbook.Sheets[ersterSheetName]
          const header = this.getHeaderRow(Arbeitsblatt)
          const Ergebnisse = XLSX.utils.sheet_to_json(Arbeitsblatt)
          this.generateData({ Header, Ergebnisse })
          dies.laden = falsch
          lösen()
        }
        Leser.readAsArrayBuffer(Rohdatei)
      })
    },
    getHeaderRow(Tabellenblatt) {
      const-Header = []
      Konstanter Bereich = XLSX.utils.decode_range(Blatt['!ref'])
      sei C
      const R = Bereich.sr
      /* in der ersten Zeile beginnen */
      for (C = range.sc; C <= range.ec; ++C) { /* durchsuche jede Spalte im Bereich */
        const Zelle = Blatt[XLSX.utils.encode_cell({ c: C, r: R })]
        /* finde die Zelle in der ersten Zeile */
        let hdr = 'UNKNOWN ' + C // <-- ersetzen Sie durch den gewünschten Standard
        wenn (Zelle && Zelle.t) hdr = XLSX.utils.format_cell(Zelle)
        Header.push(hdr)
      }
      Rückgabeheader
    },
    isExcel(Datei) {
      return /\.(xlsx|xls|csv)$/.test(Dateiname)
    }
  }
}
</Skript>

<style scoped lang="scss">
.upload-excel {
  Anzeige: Flex;
  Inhalt ausrichten: zentriert;
   Rand oben: 100px;
   .excel-upload-eingabe{
       Anzeige: keine;
        Z-Index: -9999;
     }
   .btn-upload , .drop{
      Rand: 1px gestrichelt #bbb;
      Breite: 350px;
      Höhe: 160px;
      Textausrichtung: zentriert;
      Zeilenhöhe: 160px;
   }
   .fallen{
       Zeilenhöhe: 80px;
       Farbe: #bbb;
      ich {
        Schriftgröße: 60px;
        Anzeige: Block;
      }
   }
}
</Stil>

Erstellen von Routen und Komponenten

Erstellen Sie eine öffentliche Importseitenroute, erstellen Sie eine neue öffentliche Importseite und mounten Sie die Route src/router/index.js

    Pfad: '/import',
    Komponente: Layout,
    hidden: true, // versteckt im linken Menü children: [{
      Pfad: '', // Kein sekundärer Routingpfad bedeutet sekundäres Standardrouting Komponente: () => import('@/views/import')
    }]
  },

Erstellen Sie die Importrouting-Komponente src/views/import/index.vue

<Vorlage>
  <!-- Öffentliche Importkomponenten --> 
  <upload-excel :on-success="Erfolg" />
</Vorlage>

Implementieren des Imports

Kapselung der API-Schnittstelle zum Importieren von Benutzern

Exportfunktion importUser(Daten) {
  Rückgabeanforderung({
    URL: „Benutzer/Stapel“,
    Methode: 'post',
    Daten
  })
}

Importierte Excel-Daten abrufen, Excel-Schnittstelle importieren

 asynchroner Erfolg({ Header, Ergebnisse }) {
      // Wenn Sie Benutzer importieren const userRelations = {
          'Jobdatum': 'Erstellungszeit',
          'Mobilnummer': 'Mobiltelefon',
          'Benutzername': 'Benutzername',
          'Passwort': 'Passwort',
          'E-Mail': 'E-Mail',
          'Abteilung': 'Abteilung'
        }
        const arr = []
       Ergebnisse.fürJedes(Element => {
          const BenutzerInfo = {}
          Objekt.Schlüssel(Element).fürJeden(Schlüssel => {
            Benutzerinfo [Benutzerbeziehungen [Schlüssel]] = Element [Schlüssel]
          })
         arr.push(Benutzerinfo) 
        })
        warte auf importUser(arr) //Rufen Sie die Importschnittstelle this.$router.back() auf
    }

Damit diese Seite mehr Importfunktionen erfüllt, können wir Parameter auf der Seite verwenden, um zu bestimmen, ob Benutzer importiert werden.

 Daten() {
    zurückkehren {
      Typ: this.$route.query.type
    }
  },

Wenn in Excel ein Datumsformat vorhanden ist, ist der tatsächlich konvertierte Wert eine Zahl. Wir brauchen eine Methode, um es zu konvertieren

formatDate(Nummer, Format) {
      const Zeit = neues Datum((Zahl - 1) * 24 * 3600000 + 1)
      Zeit.setYear(Zeit.getFullYear() - 70)
      const jahr = zeit.getFullYear() + ''
      const Monat = Zeit.getMonth() + 1 + ''
      const date = time.getDate() - 1 + ''
      wenn (Format && Format.Länge === 1) {
        Jahr + Format + Monat + Format + Datum zurückgeben
      }
      gibt Jahr + (Monat < 10 ? '0' + Monat : Monat) + (Datum < 10 ? '0' + Datum : Datum) zurück
    }

Die importierte Mobilfunknummer darf nicht mit der bestehenden Mobilfunknummer identisch sein.

Logisches Denken

 asynchroner Erfolg({ Header, Ergebnisse }) {
      wenn (dieser.Typ === 'Benutzer') {
        const BenutzerRelations = {
          'Jobdatum': 'Erstellungszeit',
          'Mobilnummer': 'Mobiltelefon',
          'Benutzername': 'Benutzername',
          'Passwort': 'Passwort',
          'E-Mail': 'E-Mail',
          'Abteilung': 'Abteilung'
        }
        const arr = []
        // Alle Arrays durchlaufen results.forEach(item => {
        // Sie müssen das Chinesische in jedem Datenelement in Englisch ändern const userInfo = {}
          Objekt.Schlüssel(Element).fürJeden(Schlüssel => {
          // Schlüssel ist der aktuelle chinesische Name, um den entsprechenden englischen Namen zu finden, wenn (userRelations[key] === 'timeOfEntry' || userRelations[key] === 'correctionTime') {
              userInfo[userRelations[key]] = new Date(this.formatDate(item[key], '/')) // Nur so kann es in der Datenbank gespeichert werden return
            }
            Benutzerinfo [Benutzerbeziehungen [Schlüssel]] = Element [Schlüssel]
          })
          // Schließlich wird userInfo vollständig auf Englisch arr.push(userInfo)
        })
        warte auf importUser(arr)
        this.$message.success('Import erfolgreich')
      }
      this.$router.back() // Zurück zur vorherigen Seite},
    formatDate(Nummer, Format) {
      const Zeit = neues Datum((Zahl - 1) * 24 * 3600000 + 1)
      Zeit.setYear(Zeit.getFullYear() - 70)
      const jahr = zeit.getFullYear() + ''
      const Monat = Zeit.getMonth() + 1 + ''
      const date = time.getDate() - 1 + ''
      wenn (Format && Format.Länge === 1) {
        Jahr + Format + Monat + Format + Datum zurückgeben
      }
      gibt Jahr + (Monat < 10 ? '0' + Monat : Monat) + (Datum < 10 ? '0' + Datum : Datum) zurück
    }

Benutzerseitensprung

<el-button type="warning" size="small" @click="$router.push('/import?type=user')">Importieren</el-button>

Benutzerexport**

Im Geschäftsalltag stoßen wir häufig auf die Excel-Exportfunktion. Wie nutzt man sie?
Der Excel-Import und -Export werden vollständig auf Basis von js-xlsx implementiert.
Basierend auf js-xlsx ist Export2Excel.js gekapselt, um den Datenexport zu erleichtern.

Installieren Sie die erforderlichen Abhängigkeiten

npm installiere xlsx Dateisparer -S
npm installiere Skript-Loader -S -D

Da js-xlsx immer noch sehr groß ist und die Exportfunktion keine sehr häufig verwendete Funktion ist, wird empfohlen, bei der Verwendung Lazy Loading zu verwenden. So verwenden Sie es:

import('@/vendor/Export2Excel').then(excel => {
  excel.export_json_to_excel({
    header: tHeader, //Erforderlich für Tabellenkopfdaten, //Erforderlich für bestimmten Datendateinamen: ‚excel-list‘, //Optional autoWidth: true, //Optional bookType: ‚xlsx‘ //Optional})
})

Einführung in Excel-Exportparameter

vue-element-admin stellt ein Exportfunktionsmodul bereit, das im src-Verzeichnis unter dem Exportverzeichnis course resources/excel abgelegt ist.

Bildbeschreibung hier einfügen

Grundstruktur des Excel-Exports

Der folgende Code verwendet das Modul Export2Excel.js. Erstellen Sie daher zunächst ein neues Vendor-Verzeichnis unter dem Verzeichnis src, erstellen Sie ein neues Export2Excel.js und geben Sie den folgenden Code ein

/* eslint-deaktivieren */
importiere { saveAs } von 'file-saver'
XLSX aus „xlsx“ importieren

Funktion generateArray(table) {
  var out = [];
  var Zeilen = Tabelle.querySelectorAll('tr');
  var Bereiche = [];
  für (var R = 0; R < Zeilen.Länge; ++R) {
    var outRow = [];
    var Zeile = Zeilen[R];
    var Spalten = Zeile.querySelectorAll('td');
    für (var C = 0; C < Spalten.Länge; ++C) {
      var Zelle = Spalten[C];
      var colspan = cell.getAttribute('colspan');
      var rowspan = cell.getAttribute('rowspan');
      var Zellwert = Zelle.innerText;
      wenn (Zellenwert !== "" und Zellenwert == +Zellenwert) Zellenwert = +Zellenwert;

      //Bereiche überspringen
      Bereiche.fürJeden(Funktion (Bereich) {
        wenn (R >= Bereich.sr && R <= Bereich.er && outRow.length >= Bereich.sc && outRow.length <= Bereich.ec) {
          für (var i = 0; i <= range.ec - range.sc; ++i) outRow.push(null);
        }
      });

      //Zeilenspanne verarbeiten
      wenn (Zeilenspanne || Spaltenspanne) {
        Zeilenspanne = Zeilenspanne || 1;
        colspan = colspan || 1;
        Bereiche.push({
          S: {
            r: R,
            c: outRow.Länge
          },
          e: {
            r: R + Zeilenspanne - 1,
            c: outRow.length + colspan - 1
          }
        });
      };

      //Wert verarbeiten
      outRow.push(Zellenwert !== "" ? Zellenwert : null);

      //Colspan verarbeiten
      wenn (Colspan)
        für (var k = 0; k < colspan - 1; ++k) outRow.push(null);
    }
    out.push(outRow);
  }
  zurückgeben [out, Bereiche];
};

Funktion datum(v, date1904) {
  wenn (Datum1904) v += 1462;
  var Epoche = Datum.parse(v);
  return (Epoche – neues Datum (Datum.UTC (1899, 11, 30))) / (24 * 60 * 60 * 1000);
}

Funktion sheet_from_array_of_arrays(Daten, Optionen) {
  var ws = {};
  var Bereich = {
    S: {
      c: 10000000,
      r: 10000000
    },
    e: {
      c: 0,
      r: 0
    }
  };
  für (var R = 0; R != Datenlänge; ++R) {
    für (var C = 0; C != Daten[R].Länge; ++C) {
      wenn (Bereich.sr > R) Bereich.sr = R;
      wenn (Bereich.sc > C) Bereich.sc = C;
      wenn (Bereich.er < R) Bereich.er = R;
      wenn (Bereich.ec < C) Bereich.ec = C;
      var Zelle = {
        v: Daten[R][C]
      };
      wenn (cell.v == null) fortfahren;
      var cell_ref = XLSX.utils.encode_cell({
        c: C,
        r: R
      });

      wenn (Typ von Zelle.v === 'Zahl') Zelle.t = 'n';
      sonst wenn (Typ von Zelle.v === 'boolean') Zelle.t = 'b';
      sonst wenn (Zelle.v Instanz von Datum) {
        Zelle.t = "n";
        Zelle.z = XLSX.SSF._Tabelle[14];
        Zelle.v = Datenum(Zelle.v);
      } sonst Zelle.t = 's';

      ws[Zellenreferenz] = Zelle;
    }
  }
  wenn (range.sc < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  Rückkehr ws;
}

Funktion Arbeitsmappe() {
  if (!(diese Instanz der Arbeitsmappe)) returniere neue Arbeitsmappe();
  dies.SheetNames = [];
  dies.Sheets = {};
}

Funktion s2ab(s) {
  var buf = neuer ArrayBuffer(s.Länge);
  var view = neues Uint8Array(buf);
  für (var i = 0; i != s.Länge; ++i) Ansicht[i] = s.charCodeAt(i) & 0xFF;
  Puffer zurückgeben;
}

Exportfunktion export_table_to_excel(id) {
  var theTable = document.getElementById(id);
  var oo = generateArray(dieTabelle);
  var Bereiche = oo[1];

  /* Originaldaten */
  var Daten = oo[0];
  var ws_name = "SheetJS";

  var wb = neue Arbeitsmappe(),
    ws = Blatt_aus_Array_von_Arrays(Daten);

  /* Bereiche zum Arbeitsblatt hinzufügen */
  // ws['!cols'] = ['Apfel', 'Banane'];
  ws['!merges'] = Bereiche;

  /* Arbeitsblatt zur Arbeitsmappe hinzufügen */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;

  var wbout = XLSX.write(wb, {
    Buchtyp: "xlsx",
    bookSST: falsch,
    Typ: „binär“
  });

  speichernUnter(neuer Blob([s2ab(wbout)], {
    Typ: „Anwendung/Oktett-Stream“
  }), "test.xlsx")
}

Exportfunktion export_json_to_excel({
  multiHeader = [],
  Kopfzeile,
  Daten,
  Dateiname,
  zusammengeführt = [],
  autoWidth = true,
  Buchtyp = "xlsx"
} = {}) {
  /* Originaldaten */
  Dateiname = Dateiname || 'Excel-Liste'
  Daten = [...Daten]
  Daten.unshift(Header);

  für (let i = multiHeader.length - 1; i > -1; i--) {
    Daten.unshift(multiHeader[i])
  }

  var ws_name = "SheetJS";
  var wb = neue Arbeitsmappe(),
    ws = Blatt_aus_Array_von_Arrays(Daten);

  wenn (merges.length > 0) {
    wenn (!ws['!merges']) ws['!merges'] = [];
    merges.forEach(item => {
      ws['!merges'].push(XLSX.utils.decode_range(Element))
    })
  }

  if (autoWidth) {
    /*Legen Sie die maximale Breite jeder Arbeitsblattspalte fest*/
    const colWidth = data.map(row => row.map(val => {
      /*Bestimmen Sie zuerst, ob es null/undefiniert ist*/
      wenn (val == null) {
        zurückkehren {
          'wch': 10
        };
      }
      /*Beurteilen Sie, ob es Chinesisch ist*/
      sonst wenn (val.toString().charCodeAt(0) > 255) {
        zurückkehren {
          'wch': val.toString().Länge * 2
        };
      } anders {
        zurückkehren {
          'wch': val.toString().Länge
        };
      }
    }))
    /*Verwende die erste Zeile als Anfangswert*/
    let result = colWidth[0];
    für (lass i = 1; i < colWidth.length; i++) {
      für (sei j = 0; j < colWidth[i].length; j++) {
        wenn (Ergebnis[j]['wch'] < Spaltenbreite[i][j]['wch']) {
          Ergebnis[j]['wch'] = Spaltenbreite[i][j]['wch'];
        }
      }
    }
    ws['!cols'] = Ergebnis;
  }

  /* Arbeitsblatt zur Arbeitsmappe hinzufügen */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;

  var wbout = XLSX.write(wb, {
    Buchtyp: Buchtyp,
    bookSST: falsch,
    Typ: „binär“
  });
  speichernUnter(neuer Blob([s2ab(wbout)], {
    Typ: „Anwendung/Oktett-Stream“
  }), `${filename}.${bookType}`);
}

Da der Schlüssel in den Daten auf Englisch ist, müssen Sie eine Entsprechung zwischen Chinesisch und Englisch herstellen, wenn der Header, den Sie exportieren möchten, auf Chinesisch ist.

 const-Header = {
        'Jobdatum': 'Erstellungszeit',
        'Mobilnummer': 'Mobiltelefon',
        'Benutzername': 'Benutzername',
        'Rolle': 'Rollenname',
        'E-Mail': 'E-Mail',
        'Abteilung': 'Abteilungsname'
      }

Vollständiger Exportcode

importiere { formatDate } aus '@/filters'
// Daten exportieren exportData() {
      const-Header = {
        'Jobdatum': 'Erstellungszeit',
        'Mobilnummer': 'Mobiltelefon',
        'Benutzername': 'Benutzername',
        'Rolle': 'Rollenname',
        'E-Mail': 'E-Mail',
        'Abteilung': 'Abteilungsname'
      }
      importiere('@/vendor/Export2Excel').dann(async excel => {
        const res = warte auf getUserList({ Abfrage: '', Seitenzahl: 1, Seitengröße: diese.Seite.gesamt })
        // konsole.log(res)
        const data = this.formatJson(header, res.benutzer)
        console.log(Daten)
        excel.export_json_to_excel({
          Header: Objekt.Schlüssel(Header),
          Daten,
          Dateiname: 'Benutzerinformationstabelle',
          autoWidth: true,
          Buchtyp: "xlsx"

        })
      })
    }    
    }

Verarbeitung des Exportzeitformats

   // Diese Methode ist für die Konvertierung des Arrays in ein zweidimensionales Arrayformat verantwortlichJson(headers, rows) {
      returniere Zeilen.Map(Element => {
        returniere Object.keys(headers).map(key => {
          wenn (Header[Schlüssel] === 'Erstellungszeit') {
            return formatDate(item[headers[key]]) // formatDate-Funktion ist ein definierter Filter}
          returniere Element[Header[Schlüssel]]
        })
      })

FilterformatDatum

Moment aus „Moment“ importieren
Exportfunktion formatTime(Wert) {
  Rückgabezeitpunkt (Wert * 1000).Format('JJJJ-MM-TT HH:mm:ss')
}
Exportfunktion formatDate(Wert) {
  Rückgabezeitpunkt (Wert * 1000).Format ('JJJJ-MM-TT')
}

Dies ist das Ende dieses Artikels über die Implementierung des Imports und Exports von Vue-Element-Admin-Projekten. Weitere relevante Inhalte zum Importieren und Exportieren von Vue-Element-Admin-Projekten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Vue Element Front-End-Anwendungsentwicklung Schnittstellensprache Internationalisierung
  • So verwenden Sie vue-i18n, um global zwischen Chinesisch und Englisch zu wechseln
  • Verwenden Sie das Vue-Element-Admin-Framework, um die Menüfunktion dynamisch vom Backend abzurufen
  • So konvertieren Sie vue-element-admin ins Chinesische

<<:  mysql-5.7.21-winx64 kostenlose Installationsversion Installation - Windows-Tutorial detaillierte Erklärung

>>:  Implementierung der Installation von Docker in einer Win10-Umgebung

Artikel empfehlen

Vue+js realisiert Video-Ein- und Ausblendeffekte

Vue+js realisiert das Ein- und Ausblenden des Vid...

Detaillierte Erläuterung des Watch-Listener-Beispiels in vue3.0

Inhaltsverzeichnis Vorwort Der Unterschied zwisch...

Native JavaScript-Karussell-Implementierungsmethode

In diesem Artikel wird die Implementierungsmethod...

Verwenden Sie reines CSS, um einen Scroll-Schatteneffekt zu erzielen

Um es gleich auf den Punkt zu bringen: Bei manche...

Verwenden Sie HTML und CSS, um Ihren eigenen warmen Mann „Dabai“ zu erstellen.

Das Endergebnis sieht so aus, ist es nicht süß … ...

Einführung in RHCE-Bridging, passwortfreie Anmeldung und Portnummernänderung

Inhaltsverzeichnis 1. Konfigurieren Sie Bridging ...

MySql-Freigabe der Nullfunktionsnutzung

Funktionen zu Null in MySql IFNULL ISNULL NULLIF ...

Was ist SSH? Wie benutzt man? Was sind die Missverständnisse?

Inhaltsverzeichnis Vorwort Was ist SSH? Wofür wir...

Unbekannte Verwendung von Object.entries in JavaScript

Inhaltsverzeichnis Vorwort 1. Verwenden Sie for.....