github.com/remoteit/go-ole@v1.2.7/_example/excel2/excel.go (about)

     1  // +build windows
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"log"
     8  	"os"
     9  
    10  	ole "github.com/remoteit/go-ole"
    11  	"github.com/remoteit/go-ole/oleutil"
    12  )
    13  
    14  func writeExample(excel, workbooks *ole.IDispatch, filepath string) {
    15  	// ref: https://msdn.microsoft.com/zh-tw/library/office/ff198017.aspx
    16  	// http://stackoverflow.com/questions/12159513/what-is-the-correct-xlfileformat-enumeration-for-excel-97-2003
    17  	const xlExcel8 = 56
    18  	workbook := oleutil.MustCallMethod(workbooks, "Add", nil).ToIDispatch()
    19  	defer workbook.Release()
    20  	worksheet := oleutil.MustGetProperty(workbook, "Worksheets", 1).ToIDispatch()
    21  	defer worksheet.Release()
    22  	cell := oleutil.MustGetProperty(worksheet, "Cells", 1, 1).ToIDispatch()
    23  	oleutil.PutProperty(cell, "Value", 12345)
    24  	cell.Release()
    25  	activeWorkBook := oleutil.MustGetProperty(excel, "ActiveWorkBook").ToIDispatch()
    26  	defer activeWorkBook.Release()
    27  
    28  	os.Remove(filepath)
    29  	// ref: https://msdn.microsoft.com/zh-tw/library/microsoft.office.tools.excel.workbook.saveas.aspx
    30  	oleutil.MustCallMethod(activeWorkBook, "SaveAs", filepath, xlExcel8, nil, nil).ToIDispatch()
    31  
    32  	//time.Sleep(2 * time.Second)
    33  
    34  	// let excel could close without asking
    35  	// oleutil.PutProperty(workbook, "Saved", true)
    36  	// oleutil.CallMethod(workbook, "Close", false)
    37  }
    38  
    39  func readExample(fileName string, excel, workbooks *ole.IDispatch) {
    40  	workbook, err := oleutil.CallMethod(workbooks, "Open", fileName)
    41  
    42  	if err != nil {
    43  		log.Fatalln(err)
    44  	}
    45  	defer workbook.ToIDispatch().Release()
    46  
    47  	sheets := oleutil.MustGetProperty(excel, "Sheets").ToIDispatch()
    48  	sheetCount := (int)(oleutil.MustGetProperty(sheets, "Count").Val)
    49  	fmt.Println("sheet count=", sheetCount)
    50  	sheets.Release()
    51  
    52  	worksheet := oleutil.MustGetProperty(workbook.ToIDispatch(), "Worksheets", 1).ToIDispatch()
    53  	defer worksheet.Release()
    54  	for row := 1; row <= 2; row++ {
    55  		for col := 1; col <= 5; col++ {
    56  			cell := oleutil.MustGetProperty(worksheet, "Cells", row, col).ToIDispatch()
    57  			val, err := oleutil.GetProperty(cell, "Value")
    58  			if err != nil {
    59  				break
    60  			}
    61  			fmt.Printf("(%d,%d)=%+v toString=%s\n", col, row, val.Value(), val.ToString())
    62  			cell.Release()
    63  		}
    64  	}
    65  }
    66  
    67  func showMethodsAndProperties(i *ole.IDispatch) {
    68  	n, err := i.GetTypeInfoCount()
    69  	if err != nil {
    70  		log.Fatalln(err)
    71  	}
    72  	tinfo, err := i.GetTypeInfo()
    73  	if err != nil {
    74  		log.Fatalln(err)
    75  	}
    76  
    77  	fmt.Println("n=", n, "tinfo=", tinfo)
    78  }
    79  
    80  func main() {
    81  	log.SetFlags(log.Flags() | log.Lshortfile)
    82  	ole.CoInitialize(0)
    83  	unknown, _ := oleutil.CreateObject("Excel.Application")
    84  	excel, _ := unknown.QueryInterface(ole.IID_IDispatch)
    85  	oleutil.PutProperty(excel, "Visible", true)
    86  
    87  	workbooks := oleutil.MustGetProperty(excel, "Workbooks").ToIDispatch()
    88  	cwd, _ := os.Getwd()
    89  	writeExample(excel, workbooks, cwd+"\\write.xls")
    90  	readExample(cwd+"\\excel97-2003.xls", excel, workbooks)
    91  	showMethodsAndProperties(workbooks)
    92  	workbooks.Release()
    93  	// oleutil.CallMethod(excel, "Quit")
    94  	excel.Release()
    95  	ole.CoUninitialize()
    96  }