需求内容:
在打印客户端基础上指定打印标签模板的名称,根据指定的标签模板动态生成Excel导入模板,提供Excel模板下载按钮,由用户在此模板的基础上进行填充业务数据。导入Excel文件,将数据展示到客户端,可以进行多选打印,打印后的数据客户端不在展示.
开发逻辑及代码展示:
1,基础页面组件创建,点击下载EXCEL文件模板的时候生成点击事件函数内校验用户输入的打印标签模板文件是否存在客户端,不存在直接弹窗阻断,反之校验同名的EXCEL模板文件是否存在,如果存在直接弹窗下载本地
如果不存在,获取标签模板文件内容,获取关键字段动态生成EXCEL保存到客户端项目指定位置后下载.
//下载EXCEL模板
private void button6_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(tplCode.Text))
{
MessageBox.Show("请填写打印EXCEL内容的模板名称!");
return;
}
button6.Text = "下载模板中……";
button6.Enabled = false;
// 查询模板是否存在
if (!verifyTplIsExists(tplCode.Text))
{
MessageBox.Show("模板不存在!");
button6.Text = "下载EXCEL导入模板";
button6.Enabled = true;
return;
}
// 校验是否有excel模板文件
String FilePath = Directory.GetCurrentDirectory() + "\\template\\" + tplCode.Text + ".xlsx";
bool isExistsExcel = File.Exists(FilePath);
if (!isExistsExcel)
{
//读取模板文件
String path = System.IO.Directory.GetCurrentDirectory() + "\\template\\" + tplCode.Text + ".tpl";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader reader = new StreamReader(fs);
String conStr = reader.ReadToEnd();
fs.Close();
String tplJson = GZipStringHelper.GZipDecompressString(conStr);
log.Info("读取文件信息后解压:=======>" + tplJson);
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
var commonTpl = JsonConvert.DeserializeObject<CommonTpl>(tplJson, settings);
List<CommonTplItem> tplItems = commonTpl.items;
//List<String> firstRowList = new List<String>();
firstRowList.Add("序号");
for (int i = 0; i < tplItems.Count; i++)
{
if (!tplItems[i].isValue)
{
if (!firstRowList.Contains(tplItems[i].field))
{
firstRowList.Add(tplItems[i].field);
}
}
}
FilePath = createExcelTmp(tplCode.Text);
}
string FileName = Path.GetFileName(FilePath);
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "下载文件";
saveFileDialog.Filter = "xls文件(*.xlsx)|*.xlsx";
saveFileDialog.FileName = FileName;
DialogResult dialogResult = saveFileDialog.ShowDialog(this);
if (dialogResult == DialogResult.OK)
{
System.Net.WebClient client = new System.Net.WebClient();
byte[] data = client.DownloadData(FilePath);//一个真正存放数据的地址,一般我们将连接存在数据库中,数据存放在数据服务器上
FileStream fs1 = new FileStream(saveFileDialog.FileName, FileMode.Create);
fs1.Write(data, 0, data.Length);
fs1.Close();
button6.Text = "下载EXCEL导入模板";
button6.Enabled = true;
MessageBox.Show("下载成功!");
}
else {
button6.Text = "下载EXCEL导入模板";
button6.Enabled = true;
}
}
// 创建模板
private String createExcelTmp(String tplCode)
{
Excel.Application xapp = new Excel.Application();
//准备一个空EXcel;
string filepath = @"D:\printTemplate.xlsx";
Excel.Workbook xbook = xapp.Workbooks._Open(filepath, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Excel.Worksheet xsheet = (Excel.Worksheet)xbook.Sheets[1];
//初始化ASCII值 A===>97
int ascii = 97;
String pane = "";
for (int i = 0; i < firstRowList.Count; i++)
{
byte[] array = new byte[1];
array[0] = (byte)(Convert.ToInt32(ascii)); //ASCII码强制转换二进制
pane = Convert.ToString(System.Text.Encoding.ASCII.GetString(array)) + "1";
Excel.Range rng = xsheet.get_Range(pane, Missing.Value);
rng.Value2 = firstRowList[i];
ascii++;
}
string savePath = Directory.GetCurrentDirectory() + "\\template\\" + tplCode + ".xlsx";
xbook.SaveAs(savePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
xbook.Close();
xapp.WorkbookBeforeSave += Excel_WorkbookBeforeSave;
xapp.WorkbookBeforeClose += Excel_WorkbookBeforeClose;
return savePath;
}
注意:
分析标签模板重要字段的时候,是根据 is_value进行分析, 是否为固定字段,如果不是固定字段则获取filed字段的值一次add到list中(为动态创建Excel文件表头使用)
动态创建Excel表头时候由于字段个数的不确定因素,需要借助到ASCII表码值的方式进行累加后转换成ABCDEF的方式排列EXCEL中第一行格子的坐标,知道坐标后便于给表头赋值 (完事后一定要调用EXcel保存 关闭函数,否则后面下载不了创建的模板,占用)