package main
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/storage"
"fyne.io/fyne/v2/widget"
"github.com/flopp/go-findfont"
"github.com/xuri/excelize/v2"
"os"
"strconv"
"strings"
)
// 初始化 中文字体的支持
func init() {
fontPaths := findfont.List()
for _, path := range fontPaths {
fmt.Println(path)
//楷体:simkai.ttf
//黑体:simhei.ttf
if strings.Contains(path, "simkai.ttf") {
os.Setenv("FYNE_FONT", path)
break
}
}
fmt.Println("=============")
}
/**
xlsx 只支持Sheet1表头的读取 和 复制
*/
func main() {
MyApp := app.New()
c := MyApp.NewWindow("xlsx小工具")
xlsxs(c)
c.Resize(fyne.NewSize(600, 600)) // fyne 窗口的大小
c.ShowAndRun() // 运行窗口
}
func xlsxs(w fyne.Window) {
// excelize 解析处理的 二维数组
var str [][]string
//标签控件
label1 := widget.NewLabel("")
// 选择文件对话框
openFile := dialog.NewFileOpen(func(readCloser fyne.URIReadCloser, err error) {
if readCloser == nil {
return
}
// 设置标签控件 等于打开的文件地址
label1.SetText(readCloser.URI().Path())
// 传入 文件地址 返回 二位数组数据
str = readers(readCloser.URI().Path())
}, w)
// 设置 选择文件对话框只支持查看 .xlsx 文件
openFile.SetFilter(storage.NewExtensionFileFilter([]string{".xlsx"})) //只展示go文件
// 按钮 打开 选择文件对话框
button1 := widget.NewButton("打开 目标xlsx", func() {
openFile.Show()
})
// 控件
label2 := widget.NewLabel("")
// 保存文件的 对话框
saveFile := dialog.NewFileSave(func(writeCloser fyne.URIWriteCloser, err error) {
if writeCloser == nil {
return
}
// 标签控件的title 设置
label2.SetText(writeCloser.URI().Path())
// 传入 二维数组 和 保存文件地址 写入xlsx
setxlsx(str, writeCloser.URI().Path())
}, w)
// 显示 保存文件对话框
button2 := widget.NewButton("保存 xlsx", func() {
saveFile.Show()
})
// 设置窗口 控件
w.SetContent(container.NewVBox(container.NewHBox(label1, button1), container.NewHBox(label2, button2)))
}
// 读取xlsx
func readers(path string) [][]string {
f, err := excelize.OpenFile(path) // 打开文件
if err != nil {
fmt.Println(err)
return nil
}
// 获取 Sheet1 上所有单元格
rows, err := f.GetRows("Sheet1")
for _, row := range rows {
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
return rows
}
// 设置 xlsx表格的value的
func setxlsx(str [][]string, path string) {
f := excelize.NewFile()
// 创建一个工作表
index := f.NewSheet("Sheet1")
// 单元格标头
var CellType = []string{
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
}
// 将二维数组转为map
con := map[string]string{}
for i := 0; i < len(str); i++ {
for j := 0; j < len(str[i]); j++ {
con[CellType[j]+strconv.Itoa(i+1)] = str[i][j]
}
}
fmt.Println(con)
// 设置单元格的值
// 设置 单元格内容
for k,v := range con {
f.SetCellValue("Sheet1", k, v)
}
// 设置工作簿的默认工作表
f.SetActiveSheet(index)
// 根据指定路径保存文件
if err := f.SaveAs(path); err != nil {
fmt.Println(err)
}
}
发表评论