Github地址:https://github.com/HongBorabbit/CRS-Winform
这里并没有进行优化,有能力的小伙伴可以自己封装 SQLHelper 类,这样更加规范
[toc]
功能演示
功能图
一、创建数据库
如果你不熟悉 T-SQL 语句,可以使用手动创建数据库。
# 注意这里创建完数据库(Banks)–需要把数据库设置一下 否则数据库在插入文字的时候会变成(???)的形式。
# 所以要设置数据库排序规则,注意设置前不能创建任何表,(一定要先设置数据库排序规则,再创建表),不然会报错,这里设置原因主要为了导出Excel表格
二、搭建三层
# 各层之间的引用
# 注意这里如果使用的Visual Studio 2019 来新建的,需要注意2019的类库 和其他版本的类库,这里踩到这个坑,运行会提示错误。–(之前一直使用的2017开发环境,所以踩到了这个坑)
# 建立时一定要使用 (.NET Framework)类库 ,不要选择(.NET Standard)
# 如下
1、UL层
2、DAL层
3、BLL层
4、最终效果
二、设计窗体
–主窗体
# 这里就不过多放了,详情参考一下 GitHub链接
三、导出Excel
# 关于导出Excel功能,这里也没过多研究,找的别人的轮子,照着别人文档,配置
1、1查询数据
# 使用DataTable – – 更多DataTable使用技巧 >> C# DataTable 详解
1、引用命名空间
using System.Data;
public DataTable SelectUser(string Card_Number)
{
//1、连接数据库
SqlConnection conn = new SqlConnection(GetSqlConnectionString());
//2,实例化适配器对象
String sql = String.Format("select * from Recording where Card_Number='{0}'", Card_Number);
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
DataTable table = new DataTable();
sda.Fill(ds);
return ds.Tables[0];
}
2、DataTable导出Excel
>>更多C#中datatable导出excel(三种方法)<<
private void btnExcel_Click(object sender, EventArgs e)
{
RecordingBLL recordingBLL = new RecordingBLL();
DataTable dt = recordingBLL.GetAllUser(this.label1.Text);
//下载Nuget包 Microsoft.Office.Interop.Excel
Microsoft.Office.Interop.Excel.Application appexcel = new Microsoft.Office.Interop.Excel.Application();
SaveFileDialog savefiledialog = new SaveFileDialog();
System.Reflection.Missing miss = System.Reflection.Missing.Value;
appexcel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbookdata;
Microsoft.Office.Interop.Excel.Worksheet worksheetdata;
Microsoft.Office.Interop.Excel.Range rangedata;
//设置对象不可见
appexcel.Visible = false;
System.Globalization.CultureInfo currentci = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
workbookdata = appexcel.Workbooks.Add(miss);
worksheetdata = (Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets.Add(miss, miss, miss, miss);
//给工作表赋名称
worksheetdata.Name = "saved";
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheetdata.Cells[1, i + 1] = dt.Columns[i].ColumnName.ToString();
}
//因为第一行已经写了表头,所以所有数据都应该从a2开始
rangedata = worksheetdata.get_Range("a2", miss);
Microsoft.Office.Interop.Excel.Range xlrang = null;
//irowcount为实际行数,最大行
int irowcount = dt.Rows.Count;
int iparstedrow = 0, icurrsize = 0;
//ieachsize为每次写行的数值,可以自己设置
int ieachsize = 1000;
//icolumnaccount为实际列数,最大列数
int icolumnaccount = dt.Columns.Count;
//在内存中声明一个ieachsize×icolumnaccount的数组,ieachsize是每次最大存储的行数,icolumnaccount就是存储的实际列数
object[,] objval = new object[ieachsize, icolumnaccount];
icurrsize = ieachsize;
while (iparstedrow < irowcount)
{
if ((irowcount - iparstedrow) < ieachsize)
icurrsize = irowcount - iparstedrow;
//用for循环给数组赋值
for (int i = 0; i < icurrsize; i++)
{
for (int j = 0; j < icolumnaccount; j++)
objval[i, j] = dt.Rows[i + iparstedrow][j].ToString();
System.Windows.Forms.Application.DoEvents();
}
string X = "A" + ((int)(iparstedrow + 2)).ToString();
string col = "";
if (icolumnaccount <= 26)
{
col = ((char)('A' + icolumnaccount - 1)).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();
}
else
{
col = ((char)('A' + (icolumnaccount / 26 - 1))).ToString() + ((char)('A' + (icolumnaccount % 26 - 1))).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();
}
xlrang = worksheetdata.get_Range(X, col);
// 调用range的value2属性,把内存中的值赋给excel
xlrang.Value2 = objval;
iparstedrow = iparstedrow + icurrsize;
}
//保存工作表
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlrang);
xlrang = null;
//调用方法关闭excel进程
appexcel.Visible = true;
}
这里设置了一个点击控件,点击导出Excel
# 注意这里导出的内容会显示成
# 这是因为Excel 本身格式转换了,所以我们这里设置 >> Excel的单元格格式 <<
这时候数据就显示正常了