哈哈哈哈!想不到我会为导入写出Excel这个鸡毛蒜皮的小事还写个笔记。网上C#相关内容以及是若干年前的东西了,去年的都少之甚少,然而C#在TIOBE上排名还特喵的这么高,每次我用C#的时候,心里都有一万匹草泥马疯狂奔驰。有没有人来说说,C#比R能强多少?

  • 兼容性差。说白了C#就是为不准用户调用别的语言增加难度,我特么就调用个R你还要求我降低版本!?这是嫉妒吗?

  • 语法繁琐。C#动不动就上百行了,我用R就一个新安江模型过百行,就算你代码多也就算了,还特喵的琐,一弄弄一堆没用的后缀,显摆吗?

  • 体态臃肿。C#似乎不知道什么叫做面向对象的开发,请你首先做好面向用户的开发。

算了,不说了,怎么说你都不会成器的。

数据源读取

没办法我还是得说,特喵的就调用个Excel恨不得叫人多折腾几个方法。

这里我用的数据源,结合dataset

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using OfficeOpenXml;
using System.IO;
using System.Data.OleDb;
        
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog input = new OpenFileDialog();
            input.InitialDirectory = "E:\\";
            input.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";
            string strPath;//文件完整的路径名
            if (input.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    strPath = input.FileName;
                    string strCon = "provider=Microsoft.ACE.OLEDB.12.0;data source=" + strPath + ";extended properties=excel 8.0";//关键是红色区域
                    OleDbConnection Con = new OleDbConnection(strCon);//建立连接
                    string strSql = "select * from [1$]";//表名的写法也应注意不同,对应的excel表为sheet1,在这里要在其后加美元符号$,并用中括号
                    OleDbCommand Cmd = new OleDbCommand(strSql, Con);//建立要执行的命令
                    OleDbDataAdapter da = new OleDbDataAdapter(Cmd);//建立数据适配器
                    DataSet ds = new DataSet();//新建数据集
                    da.Fill(ds, "shyman");//把数据适配器中的数据读到数据集中的一个表中(此处表名为shyman,可以任取表名)
                                          //指定datagridview1的数据源为数据集ds的第一张表(也就是shyman表),也可以写ds.Table["shyman"]
                    dataGridView1.DataSource = ds.Tables[0];
                    //label8.Text = dataGridView1.Rows[17 + 1].Cells[1].Value.ToString();
                    //label9.Text = this.dataGridView1.RowCount.ToString();
                    if (!dataGridView1.Columns[0].Name.Equals("日期") ||
                        !dataGridView1.Columns[1].Name.Equals("P") ||
                        !dataGridView1.Columns[2].Name.Equals("EP") ||
                        !dataGridView1.Columns[3].Name.Equals("EU") ||
                        !dataGridView1.Columns[4].Name.Equals("EL") ||
                        !dataGridView1.Columns[5].Name.Equals("ED") ||
                        !dataGridView1.Columns[6].Name.Equals("E") ||
                        !dataGridView1.Columns[7].Name.Equals("WU") ||
                        !dataGridView1.Columns[8].Name.Equals("WL") ||
                        !dataGridView1.Columns[9].Name.Equals("WD"))
                    {
                        MessageBox.Show("Excel文件内容格式不对!");
                        return;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);//捕捉异常
                }
            }
        }

第十六行注意,有可能那个provider对应的是老版本的office,这里的是新版。

这里只用到了最后一个using,前面的读取会用到。这个方法也相当于连接数据源,把整个表直接写到dataset数据集中,然后创建datagridview对象在对象里面用。我不太明确地知道直接在dataset中读取数据和在datagridview中的区别,不过datagridview应该是首行不计入数据内容的,dataset计入,而且两者都是从0开始,这点和R不一样。

写入

写入Excel文件有两个方法。因为这里用的是datagridview表格所以我想的是直接整个表全部写出,所以用到了另一个方法;另外还有通过epplus.dll文件的方法,这个方法适用于数据直接写入,如果有表,那么还需提取在写出,太麻烦了——听到没C#,太麻烦了!

epplus

参考:

  1. https://zhuanlan.zhihu.com/p/33146570
  2. https://github.com/hoasxyz/cipher/commit/c76b17767fdf4f4b3990e17303e9e158c2781ad1#diff-658f65a6e8709cc38c6e37b195945031

OleDb

懒人方法,自动生成……

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
            SaveFileDialog kk = new SaveFileDialog();
            kk.Title = "保存Excel文件";
            kk.Filter = "Excel(*.xls)|*.xls";
            kk.FilterIndex = 1;
            if (kk.ShowDialog() == DialogResult.OK)
            {
                string FileName = kk.FileName;  // + ".xls"
                if (File.Exists(FileName))
                    File.Delete(FileName);
                FileStream objFileStream;
                StreamWriter objStreamWriter;
                string strLine = "";
                objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
                objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
                for (int i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    if (dataGridView1.Columns[i].Visible == true)
                    {
                        strLine = strLine + dataGridView1.Columns[i].HeaderText.ToString() + Convert.ToChar(9);
                    }
                }
                objStreamWriter.WriteLine(strLine);
                strLine = "";
                
                for (int i = 0; i < dataGridView1.Rows.Count; i++)

                {
                    if (dataGridView1.Columns[0].Visible == true)
                    {
                        if (dataGridView1.Rows[i].Cells[0].Value == null)
                            strLine = strLine + " " + Convert.ToChar(9);
                        else
                            strLine = strLine + dataGridView1.Rows[i].Cells[0].Value.ToString() + Convert.ToChar(9);
                    }
                    for (int j = 1; j < dataGridView1.Columns.Count; j++)
                    {
                        if (dataGridView1.Columns[j].Visible == true)
                        {
                            if (dataGridView1.Rows[i].Cells[j].Value == null)
                                strLine = strLine + " " + Convert.ToChar(9);
                            else
                            {
                                string rowstr = "";
                                rowstr = dataGridView1.Rows[i].Cells[j].Value.ToString();
                                if (rowstr.IndexOf("\r\n") > 0)
                                    rowstr = rowstr.Replace("\r\n", " ");
                                if (rowstr.IndexOf("\t") > 0)
                                    rowstr = rowstr.Replace("\t", " ");
                                strLine = strLine + rowstr + Convert.ToChar(9);
                            }
                        }
                    }
                    objStreamWriter.WriteLine(strLine);
                    strLine = "";
                }
                objStreamWriter.Close();
                objFileStream.Close();
                MessageBox.Show(this, "保存Excel成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

不过这里只能保存为.xls格式,所以可以在导入的地方加一个.xls格式的选项,在读取那里已经有了。

项目地址:https://github.com/hoasxyz/thrlay