OneAnnal()//是加载一条记录函数        private void butAdd_Click(object sender, EventArgs e)
        {//添加按钮
            if (estimate())
            {
                OneAnnal();
                liquidation();//清空
                singers.Add(singer.Stunumber,singer);//把每条记录加载到 singers
              }
        }        private void butSave_Click(object sender, EventArgs e)
        {//保存按钮,保存到Excel
            string fileName = Application.StartupPath + "\\data\\"+classNumber+".xls";//获取文件路径
            //加载excel
            MSExcel.Application excelApp;
            MSExcel.Workbook excelDoc;
            excelApp = new MSExcel.ApplicationClass();
            Object Nothing = Missing.Value;
            excelDoc = excelApp.Workbooks.Add(Nothing);
            MSExcel.Worksheet ws = (MSExcel.Worksheet)excelDoc.Sheets[1];            int i = 3;//从第三行开始写入
            foreach (Basis oneL in singers.Values)
            {//遍历dictionary
                ws.Cells[i, 1] = oneL.Stunumber;
                ws.Columns.AutoFit();//自动调整宽度
                ws.Cells[i, 2] = oneL.Stuname;
                ws.Columns.AutoFit();
                ws.Cells[i, 3] = oneL.Idcard;
                ws.Columns.AutoFit();
                ws.Cells[i, 4] = oneL.Sex;
                ws.Columns.AutoFit();
                ws.Cells[i, 5] = oneL.Birthrate;
                ws.Columns.AutoFit();
                ws.Cells[i, 6] = oneL.Nation;
                ws.Columns.AutoFit();
                ws.Cells[i, 7] = oneL.Handsetnumber;
                ws.Columns.AutoFit();
                ws.Cells[i, 8] = oneL.QQ;
                ws.Columns.AutoFit();
                ws.Cells[i, 9] = oneL.Bedchamber;
                ws.Columns.AutoFit();
                ws.Cells[i, 10] = oneL.Houseaddress;
                ws.Columns.AutoFit();
                ws.Cells[i, 11] = i.ToString();
                i++;//行数增加
            }现在写到excel都是最后一条记录

解决方案 »

  1.   

    看看singers.Values有几条数据??
      

  2.   

    Basis 是什么类型?dictionary应该是KeyValuePair类型的,
      

  3.   

    有几条记录,但是只能找到最后一条,然后在excel里,条一样的
      

  4.   

    为什么只能找到最后一条?估计Basis就只有在singers.Values里取到一条,你看看Basis?
      

  5.   


    //你在foreach里面使用i++感觉好别扭
      for (int j = 0 ; j < singers.Values.Count(), j++)
      {
       Basis oneL = singers.Values[i];
       int i = j + 3;
      //遍历dictionary
      ws.Cells[i, 1] = oneL.Stunumber;
      ws.Columns.AutoFit();//自动调整宽度
      ws.Cells[i, 2] = oneL.Stuname;
      ws.Columns.AutoFit();
      ws.Cells[i, 3] = oneL.Idcard;
      ws.Columns.AutoFit();
      ws.Cells[i, 4] = oneL.Sex;
      ws.Columns.AutoFit();
      ws.Cells[i, 5] = oneL.Birthrate;
      ws.Columns.AutoFit();
      ws.Cells[i, 6] = oneL.Nation;
      ws.Columns.AutoFit();
      ws.Cells[i, 7] = oneL.Handsetnumber;
      ws.Columns.AutoFit();
      ws.Cells[i, 8] = oneL.QQ;
      ws.Columns.AutoFit();
      ws.Cells[i, 9] = oneL.Bedchamber;
      ws.Columns.AutoFit();
      ws.Cells[i, 10] = oneL.Houseaddress;
      ws.Columns.AutoFit();
      ws.Cells[i, 11] = i.ToString();
      i++;//行数增加
      }
      

  6.   

    通过新添将输入信息在ListView中显示,全部录入完成后,点击保存按钮
    将lISTvIEW中的数据存入Excel文件
      

  7.   

    singers.Add(singer.Stunumber,singer);//把每条记录加载到 singers
    这里我没有看到循环,仅添加了一个singer元素,你怎么说是每条记录?哪来的那么多条啊
      

  8.   

    liquidation();//清空
    这清空什么了,不会是 singers 吧?
      

  9.   


    每单击一次添加按钮就添加一条记录,把全部记录添加后,再保存
    下面代码Basis 是自定义类
     Dictionary<string, Basis> singers = new Dictionary<string, Basis>();
            Basis singer = new Basis();      private void OneAnnal()
            { //加载一条记录
                singer.Stunumber = txtStuNumber.Text;
                singer.Stuname = txtStuName.Text;
                singer.Idcard = txtIdCard.Text;
                singer.Sex = int.Parse(txtIdCard.Text.Substring(16, 1)) % 2 == 1 ? "男" : "女";
                singer.Birthrate = comYear.Text + "." + comMonth.Text + "." + comDay.Text;
                singer.Nation = comNation.Text;
                singer.Handsetnumber = txtHandsetnumber.Text;
                singer.QQ = txtQQ.Text;
                singer.Bedchamber = txtBedchamber.Text;
                singer.Houseaddress = txtHouseAddress.Text;
            } private void butAdd_Click(object sender, EventArgs e)
            {//添加按钮
                if (estimate())
                {
                    OneAnnal();
                    liquidation();//清空
                    singers.Add(singer.Stunumber,singer);
                    ListViewItem lv = new ListViewItem(singer.Stunumber);
                    lv.SubItems.AddRange(new string[]{singer.Stuname,singer.Idcard,singer.Sex,
                        singer.Birthrate,singer.Nation,singer.Handsetnumber,singer.QQ,
                        singer.Bedchamber,singer.Houseaddress});
                    listView1.Items.Add(lv);
                }
                butSave.Enabled = true;
            }        private void butSave_Click(object sender, EventArgs e)
            {//保存按钮,保存到Excel
                string fileName = Application.StartupPath + "\\data\\"+classNumber+".xls";//获取文件路径
                if(File.Exists(fileName))
                {//如果文件已存在
                    DialogResult dr = MessageBox.Show("文件已存在,是否删除","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Error);
                    //if (dr == DialogResult.OK)
                    {
                       
                        File.Delete(fileName);//删除原来的文件,重新写入
                    }
                }            MSExcel.Application excelApp;
                MSExcel.Workbook excelDoc;
                excelApp = new MSExcel.ApplicationClass();
                Object Nothing = Missing.Value;
                excelDoc = excelApp.Workbooks.Add(Nothing);
                MSExcel.Worksheet ws = (MSExcel.Worksheet)excelDoc.Sheets[1];
                int i = 3;//从第3行开始写入,即A3
                foreach (Basis oneL in singers.Values)
                {
                    ws.Cells[i, 1] = oneL.Stunumber;
                    ws.Columns.AutoFit();//自动调整宽度
                    ws.Cells[i, 2] = oneL.Stuname;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 3] = oneL.Idcard;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 4] = oneL.Sex;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 5] = oneL.Birthrate;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 6] = oneL.Nation;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 7] = oneL.Handsetnumber;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 8] = oneL.QQ;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 9] = oneL.Bedchamber;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 10] = oneL.Houseaddress;
                    ws.Columns.AutoFit();
                    ws.Cells[i, 11] = i.ToString();
                    i++;//行数增加
                }            //保存写入excel里的数据
                excelDoc.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                excelDoc.Close(Nothing, Nothing, Nothing);
                //关闭excelApp组件对象 
                excelApp.Quit();
                MessageBox.Show("保存成功");
            }
      

  10.   

    butAdd_Click 方法里加上下面红字那行
    private void butAdd_Click(object sender, EventArgs e)
    {//添加按钮
        if (estimate())
        {
            singer = new Basis();
            OneAnnal();
            liquidation();//清空
             singers.Add(singer.Stunumber, singer);
    ......
      

  11.   


    谢谢,但是我不知道为什么要这样做, singer不是定义了一个全局变量吗?
      

  12.   

    singer 虽是全局变量,但是它是引用类型,不论执行多少次 singers.Add 都是在重复添加同一个实例,OneAnnal 方法只是把它内容不断得修改了,所以在 OneAnnal 和 singers.Add 之前对 singer 重新实例化,让 singers.Add 添加与之前不同的实例。