我做了个软件,在本机上运行良好,但在某些机器上运行会出现一些错误.因为出错电脑不在身边,所以无法查看错误信息,但在本机环境中运行良好,我想代码部分应该没什么问题现在我想请教各位大大一般是什么情况会产生无法创建xml、excel文件的情况,应该怎样解决这类问题?产生错误的部分是:1)把datagridview中的数据导入xml中代码部分: private void btnWriteXml_Click(object sender, EventArgs e)
        {
 WriteXml(dsWorkReportTrans, workName, workDate.ToShortDateString());//dsWorkReportTrans为datagridview中绑定的dataset, workName添表人姓名, workDate添表日期
                }
public static void WriteXml(DataSet ds, string workname, string workdate)
        {
            if (ds.Tables[0].Rows.Count == 0)
            {
                MessageBox.Show("没有可供导出的数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                SaveFileDialog savefiledialog = new SaveFileDialog();
                savefiledialog.Filter = "Xml files (*.Xml)|*.Xml";
                savefiledialog.FilterIndex = 0;
                savefiledialog.RestoreDirectory = true;
                savefiledialog.CreatePrompt = true;
                savefiledialog.Title = "导出文件保存路径";
                savefiledialog.FileName = workname + "@" + workdate;
                //savefiledialog.ShowDialog();                if (savefiledialog.ShowDialog() == DialogResult.OK)
                {
                    string FileName = savefiledialog.FileName;
                    ds.WriteXml(FileName);
                    MessageBox.Show("数据已经成功导出到:" + FileName, "导出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                { }
            }
        }
2)把datagridview中的数据导入Excel中代码部分:public static void WriteExcel(string caption, string captionSub, string name, string date, DataGridView dgv)//5个参数分别为标题、副标题、填表人、日期、加载的datagridview数据,下面的内容主要是设计报表格式
        {
            int visiblecolumncount = 0;
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                if (dgv.Columns[i].Visible == true && (dgv.Columns[i] is DataGridViewTextBoxColumn))
                {
                    visiblecolumncount++;
                }
            }
            try
            {
                int currentcolumnindex = 1;
                Excel.ApplicationClass Mylxls = new Microsoft.Office.Interop.Excel.ApplicationClass();
                Mylxls.Application.Workbooks.Add(true);
                Mylxls.Cells.Font.Size = 10.5;
                Mylxls.Caption = caption;
                Mylxls.Cells[1, 1] = caption;
                Mylxls.Cells[2, 1] = captionSub;
                Mylxls.Cells[4, 1] = "填表人:";
                Mylxls.Cells[3, 1] = "填表日期:";
                Mylxls.Cells[4, 3] = name;
                Mylxls.Cells[3, 3] = date;
                for (int i = 0; i < dgv.Columns.Count; i++)
                {
                    if (dgv.Columns[i].Visible == true && (dgv.Columns[i] is DataGridViewTextBoxColumn))
                    {
                        Mylxls.Cells[5, currentcolumnindex] = dgv.Columns[i].HeaderText;
                        Mylxls.get_Range(Mylxls.Cells[5, currentcolumnindex], Mylxls.Cells[5, currentcolumnindex]).Cells.Borders.LineStyle = 1;
                        Mylxls.get_Range(Mylxls.Cells[5, currentcolumnindex], Mylxls.Cells[5, currentcolumnindex]).ColumnWidth = dgv.Columns[i].Width / 8;
                        Mylxls.get_Range(Mylxls.Cells[5, currentcolumnindex], Mylxls.Cells[5, currentcolumnindex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                        currentcolumnindex++;
                    }
                }
                Mylxls.get_Range(Mylxls.Cells[1, 1], Mylxls.Cells[1, visiblecolumncount]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[1, 1], Mylxls.Cells[1, 1]).RowHeight = 30;
                Mylxls.get_Range(Mylxls.Cells[1, 1], Mylxls.Cells[1, 1]).Font.Name = "黑体";
                Mylxls.get_Range(Mylxls.Cells[1, 1], Mylxls.Cells[1, 1]).Font.Size = 14;
                Mylxls.get_Range(Mylxls.Cells[1, 1], Mylxls.Cells[1, visiblecolumncount]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                Mylxls.get_Range(Mylxls.Cells[2, 1], Mylxls.Cells[2, visiblecolumncount]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[2, 1], Mylxls.Cells[2, 1]).RowHeight = 30;
                Mylxls.get_Range(Mylxls.Cells[2, 1], Mylxls.Cells[2, 1]).Font.Name = "黑体";
                Mylxls.get_Range(Mylxls.Cells[2, 1], Mylxls.Cells[2, 1]).Font.Size = 14;
                Mylxls.get_Range(Mylxls.Cells[2, 1], Mylxls.Cells[2, visiblecolumncount]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                Mylxls.get_Range(Mylxls.Cells[4, 1], Mylxls.Cells[4, 2]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[4, 1], Mylxls.Cells[4, 2]).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
                Mylxls.get_Range(Mylxls.Cells[4, 3], Mylxls.Cells[4, 4]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[4, 3], Mylxls.Cells[4, 4]).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
                Mylxls.get_Range(Mylxls.Cells[3, 1], Mylxls.Cells[3, 2]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 1], Mylxls.Cells[3, 2]).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
                Mylxls.get_Range(Mylxls.Cells[3, 3], Mylxls.Cells[3, 4]).MergeCells = true;
                Mylxls.get_Range(Mylxls.Cells[3, 3], Mylxls.Cells[3, 4]).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
                Mylxls.get_Range(Mylxls.Cells[1, 2], Mylxls.Cells[1, 2]).ColumnWidth = 12;
                Mylxls.get_Range(Mylxls.Cells[6, 1], Mylxls.Cells[dgv.Rows.Count + 4, visiblecolumncount]).NumberFormatLocal = "@";
                object[,] dataArray = new object[dgv.Rows.Count, visiblecolumncount];
                for (int i = 0; i < dgv.Rows.Count; i++)
                {
                    currentcolumnindex = 1;
                    for (int j = 0; j < dgv.Columns.Count; j++)
                    {
                        if (dgv.Columns[j].Visible == true && (dgv.Columns[j] is DataGridViewTextBoxColumn))
                        {
                            if (dgv[j, i].Value != null)
                            {
                                dataArray[i, currentcolumnindex - 1] = dgv[j, i].Value.ToString();
                            }
                            currentcolumnindex++;
                        }
                    }
                }
                Mylxls.get_Range(Mylxls.Cells[6, 1], Mylxls.Cells[dgv.Rows.Count + 4, visiblecolumncount]).Value2 = dataArray;
                Mylxls.get_Range(Mylxls.Cells[6, 1], Mylxls.Cells[dgv.Rows.Count + 4, visiblecolumncount]).Cells.Borders.LineStyle = 1;
                Mylxls.Visible = true;
            }
            catch
            {
                MessageBox.Show("信息导出失败,请确认你的机子上装有Microsoft Office Excel 2003!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            { }
        }

解决方案 »

  1.   

    1.请确认客户机的Office的版本和你的一样
    2.请确认客户机的用户是否有权限catch
                {
                    MessageBox.Show("信息导出失败,请确认你的机子上装有Microsoft Office Excel 2003!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }你这个check是一点用都没有的,因为如果用户机没有装Office,或是版本不一样,程序在调用这个Class时就会出错的,而不是等到调用你这个Method时出错。
      

  2.   

    一般都是两个问题吧 :读写权限 和  xml、excel 版本
      

  3.   

    感谢,...不过我小白...没听懂...
    1)我这个try{ }catch{ }已经试过了,是可以提示出错的.所以不太明白你的意思,可不可以贴下代码帮我改下?谢谢
    2)确认客户机的用户是否有权限??什么意思??怎么修改??
      

  4.   

    额...疯了,不懂.读写权限,软件上没有设置,你是指电脑的用户权限吗?我觉得他既然可以安装软件,权限上应该没什么问题的。
    至于xml和excel的版本,我问过的excel是2003的,不存在问题,另外客户机上由于没有数据库我是使用xml做数据库,他在生成、读取和修改xml文件上都不存在问题,但使用SaveFileDialog保存xml时有问题郁闷~
      

  5.   

    权限应该没什么问题,因为你这个是cs的,我觉得你用到了office的excel组件,可能是组件的问题。我用excel组件生成过excel,不过是bs的,配置也挺麻烦的
      

  6.   

    很简单吧,你的编译环境和运行环境不一样,简单点的办法,你把你编译机器上用到的非通用的dll文件(譬如你编译环境下的excel.dll版本是1.0.0.5而你运行环境下的excel.dll是1.0.0.0就会报出异常,建议你跟踪调试下)绑定到你的程序目录下,或者运行时检测下,运行系统的dll文件和你编译时的是否一样,不一样注册一下dll。如果你用的是xp系统下权限问题比较小,如果是server或者win7等,权限问题很有可能。
      

  7.   

    权限 ,还有就是如果那个你要用的xml文件损坏或不存在了,就会出错
      

  8.   

    小弟我第一次作c\s软件,不明白什么意思,我作完程序打包成安装文件后,难到还要检查每台要安装软件电脑的excel.dll.......,另外我要怎样检查......不知道我理解的对不对......
      

  9.   

    看了你应该是通过com调用了excel 你在别的机器上有com权限吗,我以前做过bs的需要设计com权限 cs应该也差不多吧
      

  10.   

    控制面板-管理工具-组件服务里 有2个 microsoft excel应用程序,microsoft excel 2007工作簿,添加启动用户aspnet(我是xp系统)