就单纯记录工作问题,应该也不算什么经验
我是java 程序员 临时突然要改一个C#的文件导入(相当于二次开发,但是就是最原生的二次开发什么都没有没有框架什么的也没有类包这种东西)是一个FORM界面
C#本来就是抄的java 有很多相似之处,但是他还是c语言类的 差别还是很大,例如取值集合还有集合内部元素数量用的是count 我当时是真的没有猜到 我一直拿length 和size 去找,编程规范也差太多我分不清这个东西到底是变量还是方法(中间有部分事务回滚没有处理好,真的菜),因为交接任务直接百度功能怎么实现的没有一步一步去学读取io流这种东西
y应该是C#apihttps://docs.microsoft.com/zh-cn/dotnet/api/system.data.datatablecollection.add?view=netframework-4.5.1
上网搜索C#如何读取文件
可以自行上官网下载(因为安装vs。。2008与word2007还不2017冲突所以我卸载office三件套 如果不卸载应该是不需要安装下面得这个驱动器)
注册什么微软12.0/4.0读取excel表格驱动//download.csdn.net/download/qq_37322924/12563896
#region 加载文件
public DataSet loadFile() {
OpenFileDialog file = new OpenFileDialog(); //打开文件
file.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";
file.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
file.Multiselect = false; //设置是否可以读取多个文件
if (file.ShowDialog() == DialogResult.Cancel) return null;
var path = file.FileName; //判断文件后缀
filePath.Text = path;//获取文件路径展示
string fileSuffix = Path.GetExtension(path);
if (string.IsNullOrEmpty(fileSuffix)) return null;
//下面这段注释 我本来想判断是不是空文件得 失败了 留下来准备以后在研究
/* using (FileStream fs = new FileStream(@path, FileMode.Open))
{
using(StreamReader sr=new StreamReader(fs)){
if(sr.ReadToEnd == string.Empty){
//为空
}
}
}
*/
using (DataSet ds = new DataSet())
{
//判断Excel文件是2003版本还是2007版本
string connString = "";
if (fileSuffix == ".xls")
{
//32位系统好像默认就注册了。4.0 所以使用xls 没有问题
//64位会报错 但是安装了office三件套得 不会出问题 如果出问题 应该是激活启用32位运行程序(没试成功)
connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + path + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
}else{
//在卸载office 三件套之后 需要安装上面得连解里的驱动才可以使用12
connString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + path + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
}
//读取文件
string sql_select = " SELECT * FROM [Sheet1$]";
using (OleDbConnection conn = new OleDbConnection(connString))
using (OleDbDataAdapter cmd = new OleDbDataAdapter(sql_select, conn))
{
conn.Open();
cmd.Fill(ds);
}
if (ds == null || ds.Tables.Count <= 0) { return null; }
return ds;
}
}
#endregion
//以下代码全部是java 写代码的格式,我有点不习惯C# 编辑器也会自动给我改成C#格式 看见了我又会调回java
//这个事件是按钮点击事件
//我不知道public 这个修饰符可以用在按钮点击事件上吗?
// broswer_click 这个名字是可以改的 通过FORM页面按钮属性绑定事件就可以更换事件
private void broswer_Click(object sender, EventArgs e){
/*设置是否启用按钮,本来是想加判断不让用户一直重复提交的但是代码改的太多了这个
*没有处理好在哪启用按钮
*/
this.import.Enabled = true;
/*加载文件,获取结果集 DataSet这个结果集很不知道怎么说,
*微软的api 我也没看懂,我还不会看源码源码跳不过去我没看见源码
*loadFile() 自己写的读取文件
*/
DataSet dataSet = loadFile();
//判断是否选择了文件
if (null == dataSet || null == dataSet.Tables || dataSet.Tables.Count == 0 )
{
MessageBox.Show(" 您没有选择文件");
return;
}
else{
importDataView.DataSource = null; //每次打开都清空dataGridView里面的内容
//判断文件是否是空文件 没有标题 这个最后我也没判断成功我无法判断这个文件是不是空文件
bool isEmpty = true;
/*按照我的理解 因为我只选择了一个文件 我选择了就是存在这个文件
*dataSet 里面一定有一个文件 这个文件是空的还是不是空的我不知道,
*里面是不是数组我不知道,但是看这个取值应该是 取数组的第一个
*/
DataTable dt = dataSet.Tables[0];
/*C#的foreach 循环是 for(集合里面得变量类型 集合里面得变量 in 集合)
*因为我不会判断这个文件是不是空得,所以我读了空文件,
*文件大小我也无法判断他是不是空得(我试过两个空文件 文件大小会是15k
*也可能18k, 所以我不知道还有没有别的k
*但是这个文件如果是空得 列得名字就是F1 s是大写得)
* 如果文件命名F1 他会追加我试到了F11111,现在通过列名字来判断是否是空文件/
*/
foreach (DataColumn col in dt.Columns) {
if ("F1".Equals(col.ColumnName) ) {
isEmpty = false;
}
}
if (!isEmpty) //判断选择的文件是否满足上次要求
{
MessageBox.Show(" 您选择的文件不满足文件上传的要求");
return;
}else{
/*
*文件读取之后 还要添加删除展示数据得按钮
*(就是删除当前展示得数据并没有操作excel表格,
* 我也不知道为什么要传上来改,直接改完在传不行?
*选中传这功能有了为啥还要加删除?)
* 给删除列命名为DC 随便起 因为删除到最后一行之后会找不到DC列了所以要
*捕获异常 当有异常什么也不干没有就删除
*/
try{
importDataView.Columns.Remove("DC");
} catch (ArgumentException ex){
}
DataGridViewLinkColumn tColumndelete = new DataGridViewLinkColumn();
tColumndelete.UseColumnTextForLinkValue = true;
tColumndelete.HeaderText = "删除操作";
tColumndelete.Width = 90;
tColumndelete.Text = "删除";
tColumndelete.Name = "DC";
importDataView.Columns.Add(tColumndelete);
//将上面得dataTable dt 这个集合 给dataGridView 就可以展示出来数据了
importDataView.DataSource = dt;
importDataView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
importDataView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //列标题居中
/**
* 需要将后边的操作按钮添加完再设置居中 不然 后面操作按钮不居中
*/
//单元格内容居中
foreach (DataGridViewColumn item in this.importDataView.Columns)
{
item.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
item.SortMode = DataGridViewColumnSortMode.NotSortable;//列标题右边有预留一个排序小箭头的位置,所以整个列标题就向左边多一点,而当把SortMode属性设置为NotSortable时,不使用排序,也就没有那个预留的位置,所有完全居中了
}
}
}