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)的更多相关文章

  1. JavaScript 上万条数据 导出Excel文件(改装版)

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  2. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  3. 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?

    好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...

  4. 【asp.net】将GridView数据导出Excel

    概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...

  5. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  6. 将页面中表格数据导出excel格式的文件(vue)

    近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...

  7. [django]数据导出excel升级强化版(很强大!)

    不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...

  8. pb将datawindow数据导出EXCEL

    PB有dw有自带功能可以将数据导出成excel,但是head却是字段名称,这样不直观. 所见即所得的方式是,将dw保存成html然后将后缀名改成xls,但这样的方式还有些问题就是会错列,解决的方法是将 ...

  9. 数据导出Excel中文乱码

    数据导出到EXCEL提供用户下载,当记录数大于5行时不会出现乱码.但只要不退出Excel,再删除除记录,当记录数小于5行时,导出也不会出现乱码.当然一旦退出Excel再导出就会出现乱码了. 可以试试 ...

随机推荐

  1. mysql 带外注入

    带外通道 有时候注入发现并没有回显,也不能利用时间盲注,那么就可以利用带外通道,也就是利用其他协议或者渠道,如http请求.DNS解析.SMB服务等将数据带出. payload SELECT LOAD ...

  2. vue+element表单校验功能

    要实现这个功能其实并不难,element组件直接用就可以, 但是我在使用过程中碰到了几个坑,就记录下来,分享给大家,避免落坑,话不多说,直接上过程...... 表单校验功能:   实现这个功能,总共分 ...

  3. MySQL修炼之路二

    1. 表字段的操作 1. 语法: alter table 表名 执行动作: 2. 添加字段(add) alter table 表名 add 字段名 数据类型: alter table 表名 add 字 ...

  4. Odoo中的字段显示方式和行为控制

      在odoo的视图中,字段都是通过widget来控制显示效果和行为的.   一般情况下,不同类型的字段odoo会使用默认的widget来显示和控制它的行为.   options以一种JSON对象的形 ...

  5. mysql数据库之事务和隔离级别

    事务和并发执行目的: 1.提高吞吐量,资源利用率 2.减少等待时间 连接管理器:接受请求/创建线程/认证用户/建立安全连接 并发控制:任何时候,只要有两个以上的用户试图读写同时一个文件/数据,都会带来 ...

  6. Linux下安装Nexus-3.15私服

    1.切换到root用户 创建nexus用户:useradd nexus 设置nexus用户密码:passwd nexus 2.创建文件夹并进入该目录 linux中,软件包一般放在opt目录下,安装时, ...

  7. Tram POJ - 1847

    题目链接:https://vjudge.net/problem/POJ-1847 思路:想从A到B使用开关少,想清楚了就是个简单的最短路,可以把不用开开关为权值0, 要开开关为权值1,就是求A到B开开 ...

  8. 梳理Linux中断处理子系统

    请根据下面链接进行学习: 软件方面可以参考蜗窝科技关于中断子系统的一系列文章<Linux中断子系统>,一共9篇文章,讲述了Linux中断的方方面面. <综述>是一个导论性质文档 ...

  9. 访问控制 RAM(Resource Access Management),知识点

    资料 网址 什么是访问控制 https://help.aliyun.com/document_detail/28672.html?spm=5176.11065259.1996646101.search ...

  10. js面向对象的笼统介绍

    **js进阶大纲**简单的表面组成:**对象的属性分两类,一类是数据属性,一类是访问器属性**1,数据属性用来保存数据.2,访问器属性不用来保存数据,而是定义了get,set两个函数,读取属性时,自动 ...