Commit a56091b6 authored by 黄奎's avatar 黄奎
parents de681e9e 675b3c19
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.0.1" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.0.1" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NPOI" Version="2.4.1" /> <PackageReference Include="NPOI" Version="2.5.4" />
<PackageReference Include="PinYinConverterCore" Version="1.0.2" /> <PackageReference Include="PinYinConverterCore" Version="1.0.2" />
<PackageReference Include="QRCoder" Version="1.3.9" /> <PackageReference Include="QRCoder" Version="1.3.9" />
<PackageReference Include="RabbitMQ.Client" Version="5.2.0" /> <PackageReference Include="RabbitMQ.Client" Version="5.2.0" />
......
using Newtonsoft.Json.Linq;
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.OpenXmlFormats.Wordprocessing;
using NPOI.SS.Formula.Eval;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XWPF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Mall.Common.Plugin
{
/// <summary>
/// npoi word帮助类
/// </summary>
public class NPOIWordHelper
{
/// <summary>
/// 测试word导出
/// </summary>
/// <returns></returns>
public bool CreateFistShopWord() {
string path = "D:\\testfile\\test.docx";
XWPFDocument doc = new XWPFDocument();
// 添加段落
XWPFParagraph gp = doc.CreateParagraph();
gp.Alignment = ParagraphAlignment.CENTER;//水平居中
XWPFRun gr = gp.CreateRun();
gr.GetCTR().AddNewRPr().AddNewRFonts().ascii = "黑体";
gr.GetCTR().AddNewRPr().AddNewRFonts().eastAsia = "黑体";
gr.GetCTR().AddNewRPr().AddNewRFonts().hint = ST_Hint.eastAsia;
gr.GetCTR().AddNewRPr().AddNewSz().val = (ulong)44;//2号字体
gr.GetCTR().AddNewRPr().AddNewSzCs().val = (ulong)44;
gr.GetCTR().AddNewRPr().AddNewB().val = true; //加粗
gr.GetCTR().AddNewRPr().AddNewColor().val = "red";//字体颜色
gr.SetText("成都首店经济创·领大奖");
gr.AddCarriageReturn();
gr.AppendText("奖项申报材料");
gp = doc.CreateParagraph();
gp.Alignment = ParagraphAlignment.CENTER;//水平居中
gr = gp.CreateRun();
CT_RPr rpr = gr.GetCTR().AddNewRPr();
CT_Fonts rfonts = rpr.AddNewRFonts();
rfonts.ascii = "宋体";
rfonts.eastAsia = "宋体";
rpr.AddNewSz().val = (ulong)21;//5号字体
rpr.AddNewSzCs().val = (ulong)21;
gr.SetText("(奖项3:2019年度成都首发贡献奖)");
gr.AddCarriageReturn();
gr.AppendText("时间要求:2019年1月 - 2020年6月");
gr.AddCarriageReturn();
gr.AppendText("对象要求:品牌或载体举办皆可");
gp = doc.CreateParagraph();
//添加表格
XWPFTable table = doc.CreateTable(2, 2);//创建表格 行/列
CT_Tbl m_CTTbl = doc.Document.body.GetTblArray()[0];//获得文档第一张表
CT_TblPr m_CTTblPr = m_CTTbl.AddNewTblPr();
m_CTTblPr.AddNewTblW().w = "8000"; //表宽
m_CTTblPr.AddNewTblW().type = ST_TblWidth.dxa;
m_CTTblPr.tblpPr = new CT_TblPPr
{
tblpX = "0",//表左上角坐标
tblpY = "0",
tblpXSpec = ST_XAlign.center,//若不为“Null”,则优先tblpX,即表由tblpXSpec定位
tblpYSpec = ST_YAlign.center,//若不为“Null”,则优先tblpY,即表由tblpYSpec定位
leftFromText = (ulong)180,
rightFromText = (ulong)180,
vertAnchor = ST_VAnchor.text,
horzAnchor = ST_HAnchor.page
};//表定位
#region 行赋值
CT_TcPr m_Pr = table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
m_Pr.tcW = new CT_TblWidth() { w = "2500", type = ST_TblWidth.dxa };
table.GetRow(0).Height = 1000;
table.GetRow(0).GetCell(0).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
table.GetRow(0).GetCell(0).SetText("企业名称");
table.GetRow(0).GetCell(1).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
table.GetRow(0).GetCell(1).SetText("小老弟奎哥就是大观看的睡觉啦");
table.GetRow(1).Height = 1000;
table.GetRow(1).GetCell(0).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
table.GetRow(1).GetCell(0).SetText("图文详情");
var cell = table.GetRow(1).GetCell(1);
cell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
var cW = 3000;//单元格的宽度和高度
var cH = 3000;
//得到要插入的图片
var img = new FileStream("C:\\Users\\Administrator\\Desktop\\testImage\\视频文件\\通用欢迎图.jpg", FileMode.Open, FileAccess.Read);
//进行图片插入
XWPFParagraph p = cell.AddParagraph();
XWPFRun run = p.CreateRun();
var widthPic = (int)((double)cW / 587 * 38.4 * 9525);
var heightPic = (int)((double)cH / 587 * 38.4 * 9525);
run.AddPicture(img, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "11.png", widthPic, heightPic);
#endregion
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
doc.Write(fs);
Console.WriteLine("生成word成功");
}
return true;
}
/// <summary>
/// 榜单报名生成word
/// </summary>
/// <param name="path">本地存储路径</param>
/// <param name="enrollContent"></param>
/// <param name="prizeName"></param>
/// <param name="time"></param>
/// <param name="objectName"></param>
/// <returns></returns>
public bool CreateFistShopEnrollWord(string path, string enrollContent, string prizeName, string time, string objectName)
{
XWPFDocument doc = new XWPFDocument();
#region 头部组装
// 添加段落
XWPFParagraph gp = doc.CreateParagraph();
gp.Alignment = ParagraphAlignment.CENTER;//水平居中
XWPFRun gr = gp.CreateRun();
gr.GetCTR().AddNewRPr().AddNewRFonts().ascii = "黑体";
gr.GetCTR().AddNewRPr().AddNewRFonts().eastAsia = "黑体";
gr.GetCTR().AddNewRPr().AddNewRFonts().hint = ST_Hint.eastAsia;
gr.GetCTR().AddNewRPr().AddNewSz().val = (ulong)44;//2号字体
gr.GetCTR().AddNewRPr().AddNewSzCs().val = (ulong)44;
gr.GetCTR().AddNewRPr().AddNewB().val = true; //加粗
gr.GetCTR().AddNewRPr().AddNewColor().val = "red";//字体颜色
gr.SetText("成都首店经济创·领大奖");
gr.AddCarriageReturn();
gr.AppendText("奖项申报材料");
gp = doc.CreateParagraph();
gp.Alignment = ParagraphAlignment.CENTER;//水平居中
gr = gp.CreateRun();
CT_RPr rpr = gr.GetCTR().AddNewRPr();
CT_Fonts rfonts = rpr.AddNewRFonts();
rfonts.ascii = "宋体";
rfonts.eastAsia = "宋体";
rpr.AddNewSz().val = (ulong)21;//5号字体
rpr.AddNewSzCs().val = (ulong)21;
gr.SetText("(" + prizeName + ")");
gr.AddCarriageReturn();
gr.AppendText("时间要求:" + time);
gr.AddCarriageReturn();
gr.AppendText("对象要求:" + objectName);
gp = doc.CreateParagraph();
#endregion
#region 解析报名内容
if (string.IsNullOrEmpty(enrollContent))
{
return false;
}
List<WordFormDataItem> elist = JsonHelper.DeserializeObject<List<WordFormDataItem>>(enrollContent);
elist = elist.Where(x => x.CompKey != "ImageUploadComp" && x.CompKey != "VideoUploadComp").ToList();
if (!elist.Any())
{
return false;
}
int rowNumT = elist.Count();
#endregion
//添加表格
XWPFTable table = doc.CreateTable(rowNumT, 2);//创建表格 行/列
CT_Tbl m_CTTbl = doc.Document.body.GetTblArray()[0];//获得文档第一张表
CT_TblPr m_CTTblPr = m_CTTbl.AddNewTblPr();
m_CTTblPr.AddNewTblW().w = "9000"; //表宽
m_CTTblPr.AddNewTblW().type = ST_TblWidth.dxa;
m_CTTblPr.tblpPr = new CT_TblPPr
{
tblpX = "0",//表左上角坐标
tblpY = "0",
tblpXSpec = ST_XAlign.center,//若不为“Null”,则优先tblpX,即表由tblpXSpec定位
tblpYSpec = ST_YAlign.center,//若不为“Null”,则优先tblpY,即表由tblpYSpec定位
leftFromText = (ulong)180,
rightFromText = (ulong)180,
vertAnchor = ST_VAnchor.text,
horzAnchor = ST_HAnchor.page
};//表定位
//设置列宽
CT_TcPr m_Pr = table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
m_Pr.tcW = new CT_TblWidth() { w = "2500", type = ST_TblWidth.dxa };
#region 行赋值
int rowNum = 0;
foreach (var item in elist)
{
#region 解析值
string Name = "";
string Value = "";
if (item.CompKey == "SingleLineText" || item.CompKey == "MultiLineText")
{
var obj = JsonHelper.DeserializeObject<WordTextItem>(item.CompData.ToString());
Name = obj.Name;
Value = obj.TextValue;
}
else if (item.CompKey == "DorpDownList")
{
var obj = JsonHelper.DeserializeObject<WordSelectItem>(item.CompData.ToString());
Name = obj.Name;
var olist = obj.OptionList.Where(x => ("," + obj.OptionValue + ",").Contains("," + x.Id + ",")).ToList();
Value = string.Join(",", olist.Select(x => x.Name));
}
else
{
continue;
}
#endregion
table.GetRow(rowNum).Height = 1000;
table.GetRow(rowNum).GetCell(0).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
table.GetRow(rowNum).GetCell(0).SetText(Name);
table.GetRow(rowNum).GetCell(1).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
table.GetRow(rowNum).GetCell(1).SetText(Value);
rowNum++;
}
#endregion
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
doc.Write(fs);
Console.WriteLine("生成word成功");
}
return true;
}
}
/// <summary>
/// 自定义数据
/// </summary>
public class WordFormDataItem
{
/// <summary>
///组件Key
/// </summary>
public string CompKey { get; set; }
/// <summary>
/// 是否选中
/// </summary>
public bool isCked { get; set; }
/// <summary>
/// 组件对象
/// </summary>
public object CompData { get; set; }
}
/// <summary>
/// 文本对象
/// </summary>
public class WordTextItem
{
/// <summary>
/// 名字
/// </summary>
public string Name { get; set; }
/// <summary>
/// 字数(0-不限)
/// </summary>
public int WordsLength { get; set; }
/// <summary>
/// 是否必填
/// </summary>
public bool IsRequire { get; set; }
/// <summary>
/// 文本值
/// </summary>
public string TextValue { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
/// <summary>
/// 下拉框对象
/// </summary>
public class WordSelectItem
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 是否多选
/// </summary>
public bool IsMultiple { get; set; }
/// <summary>
/// 选项值(以英文逗号相隔)
/// </summary>
public string OptionValue { get; set; }
/// <summary>
/// 是否必填
/// </summary>
public bool IsRequire { get; set; }
/// <summary>
/// 选项列表
/// </summary>
public List<WordSelectOption> OptionList { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
/// <summary>
/// 选项列表
/// </summary>
public class WordSelectOption
{
/// <summary>
/// 编号
/// </summary>
public int Id { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
}
}
\ No newline at end of file
using ICSharpCode.SharpZipLib.Checksum;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Mall.Common.Plugin
{
/// <summary>
/// 枚举帮助类
/// </summary>
public class ZipHelper
{
#region zip压缩
/// <summary>
/// 压缩文件或文件夹 ----无密码
/// </summary>
/// <param name="fileToZip">要压缩的路径-文件夹或者文件</param>
/// <param name="zipedFile">压缩后的文件名</param>
/// <param name="errorOut">如果失败返回失败信息</param>
/// <returns>压缩结果</returns>
public static bool Zip(string fileToZip, string zipedFile, ref string errorOut)
{
bool result = false;
try
{
if (Directory.Exists(fileToZip))
result = ZipDirectory(fileToZip, zipedFile, null);
else if (File.Exists(fileToZip))
result = ZipFile(fileToZip, zipedFile, null);
}
catch (Exception ex)
{
LogHelper.Write(ex, "Zip");
errorOut = ex.Message;
}
return result;
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileToZip">要压缩的文件全名</param>
/// <param name="zipedFile">压缩后的文件名</param>
/// <param name="password">密码</param>
/// <returns>压缩结果</returns>
private static bool ZipFile(string fileToZip, string zipedFile, string password)
{
bool result = true;
ZipOutputStream zipStream = null;
FileStream fs = null;
ZipEntry ent = null;
if (!File.Exists(fileToZip))
return false;
try
{
fs = File.OpenRead(fileToZip);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
fs = File.Create(zipedFile);
zipStream = new ZipOutputStream(fs);
if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
ent = new ZipEntry(Path.GetFileName(fileToZip));
zipStream.PutNextEntry(ent);
zipStream.SetLevel(6);
zipStream.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
result = false;
throw ex;
}
finally
{
if (zipStream != null)
{
zipStream.Finish();
zipStream.Close();
}
if (ent != null)
{
ent = null;
}
if (fs != null)
{
fs.Close();
fs.Dispose();
}
}
GC.Collect();
GC.Collect(1);
return result;
}
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="strFile">带压缩的文件夹目录</param>
/// <param name="strZip">压缩后的文件名</param>
/// <param name="password">压缩密码</param>
/// <returns>是否压缩成功</returns>
private static bool ZipDirectory(string strFile, string strZip, string password)
{
bool result = false;
if (!Directory.Exists(strFile)) return false;
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
strFile += Path.DirectorySeparatorChar;
ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
s.SetLevel(6); // 0 - store only to 9 - means best compression
if (!string.IsNullOrEmpty(password)) s.Password = password;
try
{
result = Zip(strFile, s, strFile);
}
catch (Exception ex)
{
throw ex;
}
finally
{
s.Finish();
s.Close();
}
return result;
}
/// <summary>
/// 压缩文件夹内部方法
/// </summary>
/// <param name="strFile"></param>
/// <param name="s"></param>
/// <param name="staticFile"></param>
/// <returns></returns>
private static bool Zip(string strFile, ZipOutputStream s, string staticFile)
{
bool result = true;
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
Crc32 crc = new Crc32();
try
{
string[] filenames = Directory.GetFileSystemEntries(strFile);
foreach (string file in filenames)
{
if (Directory.Exists(file))
{
Zip(file, s, staticFile);
}
else // 否则直接压缩文件
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);
ZipEntry entry = new ZipEntry(tempfile)
{
DateTime = DateTime.Now,
Size = fs.Length
};
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
}
catch (Exception ex)
{
result = false;
throw ex;
}
return result;
}
#endregion
}
}
...@@ -767,5 +767,73 @@ namespace Mall.Module.TradePavilion ...@@ -767,5 +767,73 @@ namespace Mall.Module.TradePavilion
{ {
return firstShop_ListEnrollRepository.GetList(dmodel); return firstShop_ListEnrollRepository.GetList(dmodel);
} }
/// <summary>
/// 榜单报名下载word 单次
/// </summary>
/// <param name="enrollId"></param>
/// <param name="mallBaseId"></param>
/// <returns></returns>
public string GetFirstShopEnrollWordExport(int enrollId, int mallBaseId, out string errorMsg)
{
errorMsg = "";
//存储的临时文件地址
string rootBook = AppDomain.CurrentDomain.BaseDirectory;
string tempPath = rootBook + "/upfile/temporary/listenroll";
var enrollModel = firstShop_ListEnrollRepository.GetEntity(enrollId);
if (enrollModel == null) { errorMsg = "报名信息不存在"; return ""; }
//获取榜单信息
var listModel = firstShop_ListRepository.GetEntity(enrollModel.ListId);
if (listModel == null) { errorMsg = "榜单不存在";return ""; }
//创建一个临时文件夹
string tempFoldr = "";
#region 解析表单内容
if (string.IsNullOrEmpty(enrollModel.Content))
{
errorMsg = "报名内容不存在,请核实后再试";
return "";
}
List<FormDataItem> elist = JsonHelper.DeserializeObject<List<FormDataItem>>(enrollModel.Content);
elist = elist.Where(x => x.CompKey == "ImageUploadComp" || x.CompKey == "VideoUploadComp").ToList();
if (elist.Any())
{
//开始下载图片视频至临时文件
foreach (var item in elist) {
var obj = JsonHelper.DeserializeObject<UploadItem>(item.CompData.ToString());
if (item.CompKey == "ImageUploadComp")
{
//图片处理
string Name = obj.Name;
foreach (var qitem in obj.FileList) {
//FileHelper.CreateImage(); 下载腾讯云至本地
}
}
else if (item.CompKey == "VideoUploadComp")
{
//视频处理
}
}
}
//ZipHelper.Zip(); 打包方法
#endregion
return "";
}
/// <summary>
/// 榜单报名下载word
/// </summary>
/// <param name="enrollIdList"></param>
/// <param name="mallBaseId"></param>
/// <returns></returns>
public string GetFirstShopEnrollWordExport(List<int> enrollIdList, int mallBaseId)
{
return "";
}
} }
} }
...@@ -2195,6 +2195,49 @@ namespace Mall.WebApi.Controllers.TradePavilion ...@@ -2195,6 +2195,49 @@ namespace Mall.WebApi.Controllers.TradePavilion
return ApiResult.Success("", pageModel); return ApiResult.Success("", pageModel);
} }
/// <summary>
/// 报名列表word导出
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetFirstShopEnrollWordExport()
{
var req = base.RequestParm;
JObject parms = JObject.Parse(req.msg.ToString());
int EnrollId = parms.GetInt("EnrollId", 0);
if (EnrollId <=0)
{
return ApiResult.ParamIsNull("请传递报名id");
}
string path = firstShopListModule.GetFirstShopEnrollWordExport(EnrollId, req.MallBaseId, out string errmsg);
if (errmsg == "")
{
return ApiResult.Success("", path);
}
else {
return ApiResult.Failed(errmsg);
}
}
/// <summary>
/// 报名列表word导出
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetFirstShopEnrollWordExportBatch() {
var req = base.RequestParm;
JObject parms = JObject.Parse(req.msg.ToString());
string EnrollIds = parms.GetStringValue("EnrollIds");//报名ids 英文逗号分隔
if (string.IsNullOrEmpty(EnrollIds)) {
return ApiResult.ParamIsNull("请传递报名ids");
}
List<int> EnrollIdList = JsonHelper.DeserializeObject<List<int>>("[" + EnrollIds + "]");
string path = firstShopListModule.GetFirstShopEnrollWordExport(EnrollIdList, req.MallBaseId);
return ApiResult.Success("", path);
}
/// <summary> /// <summary>
/// 设置报名状态 /// 设置报名状态
/// </summary> /// </summary>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment