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再导出就会出现乱码了. 可以试试 ...
随机推荐
- maven 镜像仓库 setting.xml修改 & 手动导入的包如何加到maven里面
如果不知道maven安装路径IDEA中打File->Settings 再点Build->Maven右边看maven安装路径,打开这个路径,再打开conf/settings.xml文件 ...
- VMware + CentOS 7搭建环境(二)
1.环境要求建议使用VMwareWorkstation虚拟机软件:可以使用快照功能,保存虚拟机状态:本文档示例版本10.0.1:1.2 CentOS系统的iso文件; 下载好的.iso的压缩文件格式, ...
- PHP:CURL分别以GET、POST方式请求HTTPS协议接口api【转】
1.curl以GET方式请求https协议接口 //注意:这里的$url已经包含参数了,不带参数你自己处理哦GET很简单 function curl_get_https($url){ $curl = ...
- LDA-作为线性判别 降维 推导
LDA 降维原理 前面对 LDA 作为作为分类器 有详细推导, 其核心就是 贝叶斯公式, 已知全概率, 求(条件概率)最大先验概率, 类似的问题. 而 LDA 如果作为 降维 的原理是: a. 将带上 ...
- Linux的httpd服务介绍和部署
软件介绍 客户端代理软件 IE,firefox,chroome,opera 服务器端软件 httpd,Nginx,Tengine,ISS,Lighthttp 应 ...
- windows校验文件的值
Windows校验文件值的三种方式 win键+R键输入cmd调出命令行 查看MD5值: certutil -hashfile 文件名 MD5 查看 SHA1 certutil -hashfile 文件 ...
- Django模板技术
Django模板技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模板概述 1>.模板的作用 如果使用react实现前端页面,其实Django就没有必须使用模板,它其 ...
- Docker + Nginx + Tomcat 实现负载均衡简单演示
Docker + Nginx + Tomcat 实现负载均衡 环境 [root@pinyoyougou-docker ~]# docker -v Docker version 1.12.6, buil ...
- Python基础之while和for
实现ATM的输入密码重新输入的功能 while True: user_db = 'nick' pwd_db = '123' inp_user = input('username: ') inp_pwd ...
- Console工程下如何不显示控制台黑窗口只显示Windows窗口
原文地址https://www.cnblogs.com/smiler/p/4575052.html OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口. 其 ...