我做了两个比较有意思的模块
1.微信推送
2.打印模板
代码已经能够看懂,流程也能理顺,但是对于架构层面还是不了解,打算从架构层面(或者是流程)来整理。
效果:点击 打印文件 按钮,出现打印预览,并且页面数据填入到模板中
点击按钮 触发 js事件,
js代码跳转到 新的html,
在 新的html页面 的 js代码中发送http请求到ashx(一般处理程序)
this.DownloadPrintFile = function (entityid, logicalname, userid, successCallBack, errorCallBack) {
debugger;
var url = "https://" + window.location.hostname + ":8099/DownloadPrintFile.ashx?id=" + entityid+"&logicalname="+logicalname+"&userid="+userid;
$.ajax({
url: url ,
type: 'post',
dataType: 'json',
async: true,
success: function (res) {
successCallBack(res);
},
error: function (e) {
errorCallBack(e);
}
});
}
ashx(一般处理程序)文件可以引用其他dll或者调用服务,怎么写都ok
先拿到模板文件,
//将文件copy到新路径下,isrewrite表示是否覆盖已有文件
System.IO.File.Copy(path, newpath, isrewrite);
新建 workbook,对workbook操作,
将页面中的数据从数据库中以XML格式取出,(使用存储过程更方便)涉及到sql 的 FOR XML PATH('node'), ROOT('root'),TYPE
,详细内容可以参考SQL Server XML基础学习<1>之–FOR XML PATH
数据替换,(属性名与XML节点名相同时替换)详细见代码逻辑,
再回写到excel文件
HSSFWorkbook wk = null;
using (FileStream fs = File.Open(templatefilePath,FileMode.Open,FileAccess.Read))
{
//把xls文件读入workbook变量里,之后就可以关闭了
wk = new HSSFWorkbook(fs);
//fs.Close(); 没有必要写,using会自动关闭
}
wk.SetSheetName(0, sheetname);
ISheet sheet = wk.GetSheet(sheetname);
//取出相应cell中的数据
var cell = sheet.GetRow(rowIndex).GetCell(columnIndex);
if (cellvalue.Contains("[#HeadNode.") && cellvalue.Contains("#]"))
{
var elementName = cellvalue.Replace("[#HeadNode.", "").Replace("#]", "");
//表头元素
var element = headNode.SelectSingleNode(elementName) as XmlElement;
if (element != null)
{
cell.SetCellValue(element.InnerText);
}
}
//workbook回写excel文件
using (FileStream fileStream = File.Open(templatefilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
wk.Write(fileStream);
}
将excel中行向下移动,具体参见API
sheet.shiftRows(startRow + 1, sheet.getLastRowNum(), rows,true,false);
newRow.Height = sourceRow.Height;