您当前的位置: 首页  >  博文日记

golang监听文件夹的excel文件,如果有更改,则自动同步推送到api

作者:总管理员 时间:2023-03-15 19:36:15 阅读数:622人阅读

我们需要写一个exe软件,实现监听指定目录下的excel表格,如果表格打开并更改了,则自动将更改的数据推送到指定的api接口,实现数据自动更新功能。

使用golang能很方便的编译成exe文件(当然linux也一样),代码也很简洁。创建一个main.go文件,然后go mod tidy安装依赖,之后运行go run main.go就可以了。

main.go的代码如下,只是一个思路,具体代码还是根据使用场景进行修改:

package main

import (
    "log"
    "github.com/fsnotify/fsnotify"
    "github.com/xuri/excelize/v2"
    "fmt"
    "path"
    "io/ioutil"
    "net/http"
    "bytes"
    "encoding/json"
    "time"
)

// CREATE 创建文件
// WRITE 写文件
// CHMOD 修改保存文件
// REMOVE 删除文件

func main() {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal("启动错误: ", err)
    }
    defer watcher.Close()
    done := make(chan bool)
    go func() {
        defer close(done)
        for {
            select {
                case event, ok := <-watcher.Events:
                    // if event.Op&fsnotify.Write == fsnotify.Write {
                    //     fmt.Println("modified file:", event.Name)
                    //     // 在这里处理 Excel 文件的变化
                    // }
                    if !ok {
                        return
                    }
                    fmt.Println("文件路径:" + event.Name + "变动类型:" + event.Op.String())
                    if event.Op.String() == "CREATE" || event.Op.String() == "WRITE"{
                        time.Sleep(time.Second *3)
                        readfile(event.Name)
                    }
                case err, ok := <-watcher.Errors:
                    if !ok {
                        return
                    }
                    log.Println("错误: ", err)
            }
        }
    }()
    //设置监听目录
    err = watcher.Add("./file/")
    if err != nil {
        log.Fatal("添加监听目录失败:", err)
    }
    <-done
}

func readfile(file string){
    hz := path.Ext(file)//后缀名
    if hz == ".txt" {
        //读取txt
        var bytesData = make([]byte, 128)
    	bytesData, _ = ioutil.ReadFile(file);
    	fmt.Println(string(bytesData))
    	data := make(map[string]interface{})
        data["data"] = string(bytesData)
        t, _ := json.Marshal(data)
        postsj(t)
    } else if hz == ".xlsx" || hz == ".xls" {
        // 读取excel
        f, err := excelize.OpenFile(file)
        if err != nil {
            fmt.Println(err)
            return
        }
        sheet := f.GetSheetName(0)
        rows, err := f.GetRows(sheet)
        fmt.Println(rows)
        bytesData, _ := json.Marshal(rows)
        postsj(bytesData)
    }
}

func postsj(bytesData []byte){
    resp, _ := http.Post("https://tb.kzhgzs.cn/api/getconfig","application/json", bytes.NewReader(bytesData))
    defer resp.Body.close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

记录完毕。

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱: 2554509967@qq.com

标签: golang

需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!