over 7 years ago

Zákazník webovej aplikácie napísanej v Go mal niekoľko stoviek wordowských dokumentov, v ktorých mal data, ktoré chcel naimportovať do aplikácie. Táto úloha sa dá vyriešiť priamo v Go.

Dokument vo Worde (.docx) je v podstate zip súboro, ktorý obsahuje niekoľko xml dokumentov. Samotné dáta dokumentu sú uložené v document.xml. Pretože sa jedná o upload súboru, tak je vhodné riešenie to urobiť celé v pamäti a neukladať súbor zbytočne do temporary súboru.

Riešenie je v princípe jednoduché - tu je zjednodušený kód:

// c: controller z frameworku BeeGo má funkciu GetFile

  // ktorá vracia https://golang.org/pkg/mime/multipart/#File

docx, fileHeader, err := c.GetFile("file") 
  if !strings.HasSuffix(fileHeader.Filename, "docx") {
    //ak nie je docx súbor tak sa ďalej nepokračuje

  }
  
  //rozzipovanie súboru

  buf := new(bytes.Buffer) 
fileSize, err := io.Copy(buf, docx)
if err != nil {
    return
}
r, err := zip.NewReader(bytes.NewReader(buf.Bytes()), fileSize)
if err != nil {
    return
}

//prehľadávanie rozzipovaného súboru a hľadanie document.xml

for _, f := range r.File {
    if f.Name == "word/document.xml" {  
        xmlFile, err := f.Open()
        if err != nil {
            log.Fatal(err)
        }
        parser := xml.NewDecoder(xmlFile)  //parsovanie xml súboru

.
.
.

Pôvodne som si myslel, že to v Go nezvládnem a budem musieť použiť nejakú knižnicu v inom jazyku. Ukázalo sa, že je to nielen možné, ale aj jednoduché. Navyše je to aj rýchle riešenie. Neskôr sme spracovávali všetky súbory naraz a 400 Word dokumentov bolo spracovaných a uložených do databázy za 20 sekúnd.

← Poznámky o packages
 
comments powered by Disqus