golang 数据导出excel (github.com/360EntSecGroup-Skylar/excelize)
package handler import (
"fmt"
"git.shannonai.com/public_info_prophet/prophet_risk_aggregation/model"
"github.com/360EntSecGroup-Skylar/excelize"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"net/http"
"os"
"path/filepath"
"strconv"
"time"
) // NewRequest 写入excel POST请求结构体
type NewRequest struct {
StartDate string `json:"beginDate" binding:"required"`
EndDate string `json:"endDate" binding:"required"`
FilePath string `json:"filePath"`
} // NewExcel POST
func NewExcel(c *gin.Context) {
logger := c.MustGet("logger").(*zap.SugaredLogger)
var request NewRequest
if err := c.BindJSON(&request); err != nil {
logger.Error("解析json失败原因,", err.Error())
c.JSON(http.StatusBadRequest, gin.H{
"status": "fail",
"message": "json解析失败",
"error": err.Error(),
})
return
} startDate, _ := time.Parse("2006-01-02 15:04:05", request.StartDate)
endDate, _ := time.Parse("2006-01-02 15:04:05", request.EndDate)
filePath := "C:/Users/dell/Documents/prophet_risk_aggregation"
path := CreateDateDir(startDate, filePath) //数据库查询数据
t1 := time.Now()
finNewsOnlineDAO := model.FinNewsOnlineDAO{}
var news []model.FinNewsOnline
fmt.Println(startDate, endDate)
var err error
news, err = finNewsOnlineDAO.FindNews(startDate, endDate)
newsCount := len(news)
fmt.Println("查询新闻数量:", newsCount)
count := newsCount/500 + 1
fmt.Println("要分为", count, "个excel表格") if err != nil {
logger.Error("数据库查询错误")
c.Status(500)
return
}
t2 := time.Now()
wastingTime := t2.Sub(t1)
fmt.Println("耗时:", wastingTime)
for i := 0; i < count; i++ {
newsList := listPaging(news, i+1, 500)
xlsxNews := excelize.NewFile() var starPushDate time.Time
var endPushDate time.Time
//var count int
count := len(newsList)
c := strconv.Itoa(count + 1)
for index, news := range newsList {
if index == 0 {
xlsxNews.SetSheetRow("Sheet1", "A1", &[]interface{}{
"NEWS_ID", "DUP_ID", "PUBLISH_DATE",
"TITLE", "ORIGIN_TITLE", "CONTENT", "SOURCE", "URL", "SENTIMENT", "ORIGIN",
"SHANNON_ID", "HASH_ID", "INSERT_TIME",
"ORIGINAL_INSERT_TIME", "CONTENT_SIMHASH",
})
} lint := strconv.Itoa(index + 2)
if lint == "2" {
starPushDate = news.PublishDate
}
if lint == c {
endPushDate = news.PublishDate
} xlsxNews.SetSheetRow("Sheet1", "A"+lint, &[]interface{}{
news.NewsID, news.DupID, news.PublishDate.Format("2006-01-02 15:04:05"),
news.Title, news.OriginTitle, news.Content, news.Source, news.URL, news.Sentiment, news.Origin,
news.ShannonID, news.HashID, news.InsertTime.Format("2006-01-02 15:04:05"),
news.OriginalInsertTime.Format("2006-01-02 15:04:05"), news.ContentSimhash,
})
}
// 四位字符串右对齐填充0
fileSerialNumber := fmt.Sprintf("%04d", i)
_= xlsxNews.SaveAs(path + "./" + fileSerialNumber + "_news.xlsx") fmt.Println(fileSerialNumber + "_news.xlsx >>>>> 写入成功")
var newsRisk []model.NewsRisk
riskRecordDAO := model.RiskRecordDAO{}
newsRisk, err = riskRecordDAO.FindNewsRisk(starPushDate, endPushDate)
newsRiskCount := len(newsRisk)
fmt.Println("查询新闻风险数量:", newsRiskCount)
xlsxRisk := excelize.NewFile()
for index, risk := range newsRisk {
if index == 0 {
// 如果为0写入新的excel 第一行为字段名称
xlsxRisk.SetSheetRow("Sheet1", "A1", &[]interface{}{
"OBJECT_ID", "NEWS_ID", "ORIGIN", "SHANNON_ID",
"PUBLISH_DATE", "NEWS_SENTIMENT", "NEWS_SENTIMENT_SCORE",
"COMPANY_NAME", "COMPANY_CODE", "IS_MAJOR_COMPANY",
"ENTITY_TYPE", "COMPANY_WEIGHT", "COMPANY_SENTIMENT",
"SHANNON_RISK_TYPE", "SHANNON_SENTIMENT_TYPE", "SHANNON_RISK_WEIGHT",
"SHANNON_RISK_CONFIDENCE", "HINT", "VERSION_ID", "INSERT_TIME",
"IN_TITLE", "HINT_COUNT",
})
}
//因为index是从0开始,第一行被字段占用,从第二行开始写入整行数据
lint := strconv.Itoa(index + 2)
xlsxRisk.SetSheetRow("Sheet1", "A"+lint, &[]interface{}{
risk.ObjectID, risk.NewsID, risk.ORIGIN, risk.ShannonID,
risk.PublishDate.Format("2006-01-02 15:04:05"),
risk.NewsSentiment, risk.NewsSentimentScore, risk.CompanyName,
risk.CompanyCode, risk.IsMajorCompany, risk.EntityType,
risk.CompanyWeight, risk.CompanySentiment, risk.ShannonRiskType,
risk.ShannonSentimentType, risk.ShannonRiskWeight, risk.ShannonRiskConfidence,
risk.Hint, risk.VersionID, risk.InsertTime.Format("2006-01-02 15:04:05"),
risk.InTitle, risk.HintCount,
})
}
_ = xlsxRisk.SaveAs(path + "./" + fileSerialNumber + "_risk.xlsx")
fmt.Println(fileSerialNumber + "_risk.xlsx >>>>> 写入成功☺")
}
c.JSON(http.StatusOK, gin.H{
"status": "successful",
})
} // listPaging 列表分页
func listPaging(newsList []model.FinNewsOnline, pageNum, pageSize int) (resNewsList []model.FinNewsOnline) {
offset, limit := GetOffsetAndLimit(pageNum, pageSize, len(newsList))
selectedNewsList := newsList[offset : offset+limit]
for i := 0; i < len(selectedNewsList); i++ {
item := model.FinNewsOnline{
NewsID: selectedNewsList[i].NewsID,
DupID: selectedNewsList[i].DupID,
PublishDate: selectedNewsList[i].PublishDate,
Title: selectedNewsList[i].Title,
OriginTitle: selectedNewsList[i].OriginTitle,
Content: selectedNewsList[i].Content,
Source: selectedNewsList[i].Source,
URL: selectedNewsList[i].URL,
Sentiment: selectedNewsList[i].Sentiment,
Origin: selectedNewsList[i].Origin,
ShannonID: selectedNewsList[i].ShannonID,
HashID: selectedNewsList[i].HashID,
InsertTime: selectedNewsList[i].InsertTime,
OriginalInsertTime: selectedNewsList[i].OriginalInsertTime,
ContentSimhash: selectedNewsList[i].ContentSimhash,
}
resNewsList = append(resNewsList, item)
}
return resNewsList
} // GetOffsetAndLimit func
func GetOffsetAndLimit(pageNum, pageSize, totalNum int) (offset, limit int) {
offset = (pageNum - 1) * pageSize
if (pageNum-1)*pageSize >= totalNum {
return 0, 0
} else if pageNum*pageSize > totalNum && (pageNum-1)*pageSize < totalNum {
limit = totalNum - (pageNum-1)*pageSize
} else {
limit = pageSize
}
return offset, limit
} // CreateDateDir 根据当前日期来创建文件夹
func CreateDateDir(date time.Time, Path string) string {
folderName := date.Format("20060102")
folderPath := filepath.Join(Path, folderName)
if _, err := os.Stat(folderPath); os.IsNotExist(err) {
//先创建文件夹、再修改权限
_ = os.Mkdir(folderPath, 777)
_ = os.Chmod(folderPath, 777)
}
return folderPath
}
golang 数据导出excel (github.com/360EntSecGroup-Skylar/excelize)的更多相关文章
- JavaScript 上万条数据 导出Excel文件(改装版)
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- JavaScript 上万条数据 导出Excel文件 页面卡死
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?
好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...
- 【asp.net】将GridView数据导出Excel
概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...
- Java使用POI实现数据导出excel报表
Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...
- 将页面中表格数据导出excel格式的文件(vue)
近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...
- [django]数据导出excel升级强化版(很强大!)
不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...
- pb将datawindow数据导出EXCEL
PB有dw有自带功能可以将数据导出成excel,但是head却是字段名称,这样不直观. 所见即所得的方式是,将dw保存成html然后将后缀名改成xls,但这样的方式还有些问题就是会错列,解决的方法是将 ...
- 数据导出Excel中文乱码
数据导出到EXCEL提供用户下载,当记录数大于5行时不会出现乱码.但只要不退出Excel,再删除除记录,当记录数小于5行时,导出也不会出现乱码.当然一旦退出Excel再导出就会出现乱码了. 可以试试 ...
随机推荐
- 【夯实基础】-浅谈"单点登录"的几种实现方式
单点登录 一.Session跨域 所谓Session跨域就是摒弃了系统提供的Session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案. 如:通过设置cookie的domai ...
- App过大
最近开发中遇到一个报错信息 如下 Error:Cannot fit requested classes in a single dex file.Try supplying a main-dex li ...
- unity点击按钮弹出操作提示界面
1.首先在相应的位置添加一个(UGUI控件)image,在image下添加文本框和按钮设计弹出框内容如图: 2.新建C#脚本UITips using System.Collections; using ...
- pyecharts的使用
折线图1 import pyecharts.options as opts from pyecharts.charts import Line x_data = ["Mon", ...
- python脚本测试websocket接口协议
import websocket url = 'wss://host:port/rt/tr' #websocket连接地址 ws = websocket.create_connection(url) ...
- httprunner学习25-文件上传multipart/form-data
前言 httprunner上传文件接口,其实跟requests上传文件的接口是一样的,之前在python接口系列里面有案例 python接口自动化16-multipart/form-data上传图片 ...
- python 操作目录
每天写一点,总有一天我这条咸鱼能变得更咸 python 中对文件及目录的操作基本依赖与os,shutil模块,其中以os模块为主,最主要的几个方法实例如下: 1.判断文件/目录是否存在(os.path ...
- LA 4998简单加密游戏 —— 自相似性质&&不动点迭代
题意 输入正整数 $K_1$($K_1 \leq 50000$),找一个12为正整数 $K_2$(不能含有前导0)使得 ${K_1}^{K_2} \equiv K_2(mod \ {10}^{12}) ...
- 全面分析:APP中的消息功能设计
一.定义 APP的“消息”模块,是通过APP或手机这个客户端,围绕某个产品的功能进行交流.沟通的重要方式.这种沟通,一方是运营人员或商家,也可以是产品或系统本身,为方便说明笔者这里姑且统一简称为B端, ...
- Python3 异常
异常 --- 程序执行时产生的事件,为Python对象 <Python学习手册>笔记 异常总是通过实例对象来识别 默认的异常处理器 --- 打印标准出错信息(包括引发的异常和堆栈跟踪-异常 ...