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 }