private void ExportExcel()
        {
            DataTable dtVilationList = Grab.GetVilationList(guid.ToString());            SaveFileDialog dlg = new SaveFileDialog()
            {
                Filter = "*.xls|*.xls",
                RestoreDirectory = true,
                FileName = DateTime.Now.ToString("yyyyMMddhhmmss")
            };
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string[] columns = new string[] {
                    "车牌","违规时间","违规行为","违规地点","罚款金额","扣分","异地办理费"
                };
                int i = 0;
                foreach (string c in columns)
                {
                    dtVilationList.Columns[i++].ColumnName = c;
                }
                CSD.Tools.DownExcel downExcel = new CSD.Tools.DownExcel();
                downExcel.Width(0, 16);
                downExcel.Width(1, 18);
                downExcel.Width(2, 35);
                downExcel.Width(3, 35);
                downExcel.Width(6, 16);
                downExcel.File(dtVilationList, dlg.FileName);
                MessageBox.Show("导出成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
第一次SaveFileDialog 是正常显示,并能保存,,再次点击导出Excel的话会报错误,
错误定位在,“ if (dlg.ShowDialog() == DialogResult.OK)”
错误信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
数据是从Access读取的

解决方案 »

  1.   

    执行下面代码是没问题的,估计这应该还是你那个cst导致的            SaveFileDialog dlg = new SaveFileDialog()
                {
                    Filter = "*.xls|*.xls",
                    RestoreDirectory = true,
                    FileName = DateTime.Now.ToString("yyyyMMddhhmmss")
                };
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    
                    MessageBox.Show("导出成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
      

  2.   

    downExcel这个每次处理完不需要释放吗?不释放不是一直占用着你用的文件?
      

  3.   

    调试一下看两次dtVilationList有什么不同
      

  4.   

    dtVilationList这个是相同的,这个地方没报错,只是从Access里面取数据
      

  5.   


    File()方法是这样写的:
       /// <summary>
            /// 输出数据
            /// </summary>
            /// <param name="FileName"></param>
            public void File(string FileName)
            {
                using(MemoryStream ms = new MemoryStream())
                {
                    hssfworkbook.Write(ms);
                    ms.Flush();
                    ms.Position = 0;
                    using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write))
                    {
                        byte[] data = ms.ToArray();
                        fs.Write(data, 0, data.Length);
                        fs.Flush();
                    }
                }
            }
      

  6.   


    这个应该和SaveFileDialog没多大关系吧
      

  7.   

    貌似问题出在DownExcel上,其他地方实在看不出什么问题了
      

  8.   


    DataTable dtVilationList = Grab.GetVilationList(guid.ToString());
    其中Grab是个抽象类,我调试发现是这个地方的问题
    如果DataTable dtVilationList = Grab.GetVilationList(guid.ToString());只初始化一次,就没问题
      

  9.   

    原因是我机器上用的是Access 2010,然后安装Access 2007或者下载 AccessRuntime 2007就可以了,Access数据库改为03版本的也可以