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再导出就会出现乱码了. 可以试试 ...
随机推荐
- python高级编程——入门语法(一)
元类 在python中一切皆对象,类也是对象,只不过类是一个创建对象的对象,我们可以在类中动态的创建一个类,比如 def func(name): if name == "Plane" ...
- Qt for Android修改应用程序的图标和名称
使用QT开发出的Android Apk安装后默认的图标是安卓的小机器人,下面介绍在QT5.12版本上修改APP名称和图标的方法. 1. 编译一次项目后,在编译目录下找到AndroidManifest ...
- Vue入门篇
Vue-cli开发环境搭建 1. 安装nodejs 2. 设置缓存文件夹 $ npm config set cache "D:\vueProject\nodejs\node_cache&qu ...
- set实现交集,并集,差集
let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 并集 let union = new Set([...a, ...b]); // ...
- Markdown随笔
Markdown随笔 这两天兴致来了,想尝试一下使用 Markdown. 写这篇博客时我用的是: MarkdownPad 2 关于 MarkdownPad 2 的安装破解网上有很多教程了,这里我就不赘 ...
- Modern Cpp记录
#include <iostream> # include <set> #include <chrono> #ifndef UNUSED #define UNUSE ...
- 转:Oracle中SQL语句执行过程中
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- Centos系统 tomcat 中的应用与北京时间相差8小时
解决方法: 在 catalina.sh中的 JAVA_OPTS 加上 -Duser.timezone=GMT+08 启动时 startup.sh 会调用 catalina.sh.
- Django框架(六)--模板层:变量、过滤器、标签、自定义标签和过滤器
将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def c ...
- 201871010126 王亚涛 《面向对象程序设计(java)》 第四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...