Sfoglia il codice sorgente

Add TIF, TIFF format images and more detailed error information when open the encrypted file

xuri 6 anni fa
parent
commit
54def7eaad
7 ha cambiato i file con 95 aggiunte e 10 eliminazioni
  1. 12 0
      excelize.go
  2. 9 0
      excelize_test.go
  3. 1 1
      picture.go
  4. 17 8
      picture_test.go
  5. BIN
      test/images/excel.tif
  6. 55 0
      xmlApp.go
  7. 1 1
      xmlDrawing.go

+ 12 - 0
excelize.go

@@ -14,6 +14,7 @@ import (
 	"archive/zip"
 	"bytes"
 	"encoding/xml"
+	"errors"
 	"fmt"
 	"io"
 	"io/ioutil"
@@ -69,6 +70,17 @@ func OpenReader(r io.Reader) (*File, error) {
 
 	zr, err := zip.NewReader(bytes.NewReader(b), int64(len(b)))
 	if err != nil {
+		identifier := []byte{
+			// checking protect workbook by [MS-OFFCRYPTO] - v20181211 3.1 FeatureIdentifier
+			0x3c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x73, 0x00,
+			0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00,
+			0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2e, 0x00, 0x44, 0x00, 0x61, 0x00,
+			0x74, 0x00, 0x61, 0x00, 0x53, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00,
+			0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+		}
+		if bytes.Contains(b, identifier) {
+			return nil, errors.New("not support encrypted file currently")
+		}
 		return nil, err
 	}
 

+ 9 - 0
excelize_test.go

@@ -1,6 +1,7 @@
 package excelize
 
 import (
+	"bytes"
 	"fmt"
 	"image/color"
 	_ "image/gif"
@@ -185,6 +186,14 @@ func TestSaveAsWrongPath(t *testing.T) {
 func TestOpenReader(t *testing.T) {
 	_, err := OpenReader(strings.NewReader(""))
 	assert.EqualError(t, err, "zip: not a valid zip file")
+	_, err = OpenReader(bytes.NewReader([]byte{
+		0x3c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x73, 0x00,
+		0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00,
+		0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x2e, 0x00, 0x44, 0x00, 0x61, 0x00,
+		0x74, 0x00, 0x61, 0x00, 0x53, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00,
+		0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+	}))
+	assert.EqualError(t, err, "not support encrypted file currently")
 }
 
 func TestBrokenFile(t *testing.T) {

+ 1 - 1
picture.go

@@ -385,7 +385,7 @@ func (f *File) addMedia(file []byte, ext string) string {
 // setContentTypePartImageExtensions provides a function to set the content
 // type for relationship parts and the Main Document part.
 func (f *File) setContentTypePartImageExtensions() {
-	var imageTypes = map[string]bool{"jpeg": false, "png": false, "gif": false}
+	var imageTypes = map[string]bool{"jpeg": false, "png": false, "gif": false, "tiff": false}
 	content := f.contentTypesReader()
 	for _, v := range content.Defaults {
 		_, ok := imageTypes[v.Extension]

+ 17 - 8
picture_test.go

@@ -1,8 +1,13 @@
 package excelize
 
 import (
-	"fmt"
+	_ "image/gif"
+	_ "image/jpeg"
 	_ "image/png"
+
+	_ "golang.org/x/image/tiff"
+
+	"fmt"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -25,37 +30,41 @@ func BenchmarkAddPictureFromBytes(b *testing.B) {
 }
 
 func TestAddPicture(t *testing.T) {
-	xlsx, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
+	f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
 	if !assert.NoError(t, err) {
 		t.FailNow()
 	}
 
 	// Test add picture to worksheet with offset and location hyperlink.
-	err = xlsx.AddPicture("Sheet2", "I9", filepath.Join("test", "images", "excel.jpg"),
+	err = f.AddPicture("Sheet2", "I9", filepath.Join("test", "images", "excel.jpg"),
 		`{"x_offset": 140, "y_offset": 120, "hyperlink": "#Sheet2!D8", "hyperlink_type": "Location"}`)
 	if !assert.NoError(t, err) {
 		t.FailNow()
 	}
 
 	// Test add picture to worksheet with offset, external hyperlink and positioning.
-	err = xlsx.AddPicture("Sheet1", "F21", filepath.Join("test", "images", "excel.jpg"),
+	err = f.AddPicture("Sheet1", "F21", filepath.Join("test", "images", "excel.jpg"),
 		`{"x_offset": 10, "y_offset": 10, "hyperlink": "https://github.com/360EntSecGroup-Skylar/excelize", "hyperlink_type": "External", "positioning": "oneCell"}`)
 	if !assert.NoError(t, err) {
 		t.FailNow()
 	}
 
-	file, err := ioutil.ReadFile(filepath.Join("test", "images", "excel.jpg"))
+	file, err := ioutil.ReadFile(filepath.Join("test", "images", "excel.png"))
 	if !assert.NoError(t, err) {
 		t.FailNow()
 	}
 
 	// Test add picture to worksheet from bytes.
-	assert.NoError(t, xlsx.AddPictureFromBytes("Sheet1", "Q1", "", "Excel Logo", ".jpg", file))
+	assert.NoError(t, f.AddPictureFromBytes("Sheet1", "Q1", "", "Excel Logo", ".png", file))
 	// Test add picture to worksheet from bytes with illegal cell coordinates.
-	assert.EqualError(t, xlsx.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".jpg", file), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
+	assert.EqualError(t, f.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".png", file), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
+
+	assert.NoError(t, f.AddPicture("Sheet1", "Q8", filepath.Join("test", "images", "excel.gif"), ""))
+	assert.NoError(t, f.AddPicture("Sheet1", "Q15", filepath.Join("test", "images", "excel.jpg"), ""))
+	assert.NoError(t, f.AddPicture("Sheet1", "Q22", filepath.Join("test", "images", "excel.tif"), ""))
 
 	// Test write file to given path.
-	assert.NoError(t, xlsx.SaveAs(filepath.Join("test", "TestAddPicture.xlsx")))
+	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddPicture.xlsx")))
 }
 
 func TestAddPictureErrors(t *testing.T) {

BIN
test/images/excel.tif


+ 55 - 0
xmlApp.go

@@ -0,0 +1,55 @@
+// Copyright 2016 - 2019 The excelize Authors. All rights reserved. Use of
+// this source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+//
+// Package excelize providing a set of functions that allow you to write to
+// and read from XLSX files. Support reads and writes XLSX file generated by
+// Microsoft Excel™ 2007 and later. Support save file without losing original
+// charts of XLSX. This library needs Go version 1.8 or later.
+
+package excelize
+
+import "encoding/xml"
+
+type xlsxProperties struct {
+	XMLName              xml.Name `xml:"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties Properties"`
+	Template             string
+	Manager              string
+	Company              string
+	Pages                int
+	Words                int
+	Characters           int
+	PresentationFormat   string
+	Lines                int
+	Paragraphs           int
+	Slides               int
+	Notes                int
+	TotalTime            int
+	HiddenSlides         int
+	MMClips              int
+	ScaleCrop            bool
+	HeadingPairs         *xlsxVectorVariant
+	TitlesOfParts        *xlsxVectorLpstr
+	LinksUpToDate        bool
+	CharactersWithSpaces int
+	SharedDoc            bool
+	HyperlinkBase        string
+	HLinks               *xlsxVectorVariant
+	HyperlinksChanged    bool
+	DigSig               *xlsxDigSig
+	Application          string
+	AppVersion           string
+	DocSecurity          int
+}
+
+type xlsxVectorVariant struct {
+	Content string `xml:",innerxml"`
+}
+
+type xlsxVectorLpstr struct {
+	Content string `xml:",innerxml"`
+}
+
+type xlsxDigSig struct {
+	Content string `xml:",innerxml"`
+}

+ 1 - 1
xmlDrawing.go

@@ -42,7 +42,7 @@ const (
 	NameSpaceDublinCoreMetadataIntiative = "http://purl.org/dc/dcmitype/"
 )
 
-var supportImageTypes = map[string]string{".gif": ".gif", ".jpg": ".jpeg", ".jpeg": ".jpeg", ".png": ".png"}
+var supportImageTypes = map[string]string{".gif": ".gif", ".jpg": ".jpeg", ".jpeg": ".jpeg", ".png": ".png", ".tif": ".tiff", ".tiff": ".tiff"}
 
 // xlsxCNvPr directly maps the cNvPr (Non-Visual Drawing Properties). This
 // element specifies non-visual canvas properties. This allows for additional