技术栈
C# WPF MVVM(prism)
页面结构
技术路线及难点
一、将Excel文件转化为datatable
本项目使用的是xls文件,使用EPPLUS和NPIO转换失败,根据资料显示EPPLUS适合转换xlsx格式,NPIO适合转换xls,本文采用的是内置的转换方法
public DataTable GetExcelTableByOleDB(string strExcelPath, string tableName)
{
try
{
DataTable dtExcel = new DataTable();
//数据表
DataSet ds = new DataSet();
//获取文件扩展名
string strExtension = System.IO.Path.GetExtension(strExcelPath);
string strFileName = System.IO.Path.GetFileName(strExcelPath);
//Excel的连接
OleDbConnection objConn = null;
switch (strExtension)
{
case ".xls":
objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 8.0;HDR=yes;IMEX=1;\"");
break;
case ".xlsx":
objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 12.0;HDR=yes;IMEX=1;\"");//此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串) 备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数,"HDR=No;"正好与前面的相反。"IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
break;
default:
objConn = null;
break;
}
if (objConn == null)
{
return null;
}
objConn.Open();
//获取Excel中所有Sheet表的信息
System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
//获取Excel的第一个Sheet表名
// string tableName1 = schemaTable.Rows[0][2].ToString().Trim();
string strSql = "select * from [" + tableName + "$]";
//获取Excel指定Sheet表中的信息
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn);
myData.Fill(ds, tableName);//填充数据
objConn.Close();
//dtExcel即为excel文件中指定表中存储的信息
dtExcel = ds.Tables[tableName];
return dtExcel;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
return null;
}
}
二、将datatable绑定到datagrid
在winfrom环境下此类操作比较简单,但到了wpf下就变得比较复杂,尤其是在MVVM架构下。
这里的绑定关键点是 ObservableCollection<>类型的使用
<>内应用一个和excel表头相同架构的类(ExcelDataModel)
另一个关键点是循环datatable每一行,然后将起哄中每一个单元格放置到一个实体化的ExcelDataModel中,再把ExcelDataModel添加到Source中
三、关于WPF中combox的使用
关于这一块网上有多种方法,大多较为繁琐难懂,这里采用习惯的ObservableCollection<>类型进行绑定
View代码
<ComboBox x:Name="comboBox" ItemsSource="{Binding PlcCategory}" SelectedItem="{Binding SelectedCpuType,Mode=OneWayToSource}" DisplayMemberPath="Name" Margin="180,346,441,41">
ViewModel代码
public class CategoryInfo
{
public string Name { get; set; }
public int Value { set; get; }
}
public CategoryInfo SelectedCpuType { set; get; }
public ObservableCollection<CategoryInfo> PlcCategory { get; set; } = new ObservableCollection<CategoryInfo>() { };
public MainWindowViewModel()//构造函数
{
var v = Enum.GetValues(typeof(CpuType));
foreach (var item in v)
{
PlcCategory.Add(new CategoryInfo() { Value=Convert.ToInt32(item),Name=item.ToString()});
}
}
关于其中的Enum.GetValues(typeof(CpuType));需要重点说明一下
比如: public enum K
{
x=0,
y,
}
Enum.GetNames()返回的是 : x y
Enum.GetValues() 返回的是:0 1
在本文中
public enum CpuType
{
S7200 = 0,
Logo0BA8 = 1,
S7300 = 10,
S7400 = 20,
S71200 = 30,
S71500 = 40
}
Enum.GetValues(typeof(CpuType))的值应该为 0 1 10 20 30 40
Enum.GetNames则应为前面的PLC型号
注意 这里的GetValues GetName和CategoryInfo的name和value分别代表Enum的名称和值,以及 Combox的选择显示值和选后返回值
-----------结束----------------------------------------
1
1
1
1
1
1
1
1
1
1
1
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎