我有一个已赋值的二维数组,想将其写入新建的excel文件中
微软的示例代码:
            object[,] objData = new Object[100, 3];
            Random rdm = new Random((int)DateTime.Now.Ticks);
            double nOrderAmt, nTax;
            for (int r = 0; r < 100; r++)
            {
                objData[r, 0] = "ORD" + r.ToString("0000");
                nOrderAmt = rdm.Next(1000);
                objData[r, 1] = nOrderAmt.ToString("c");
                nTax = nOrderAmt * 0.07;
                objData[r, 2] = nTax.ToString("c");
            }
            Range range = worksheet.get_Range("A1", Missing.Value);
            range = range.get_Resize(100, 3);
            range.Value2 = objData;
在我的机器上工作正常,但我的代码:
            Object[,] result = new Object[ing_num, header_info.Length];
            int i = 0;
            int j = 0;
            // 从文件中读数据为数组赋值
            while (line_cont != null)
            {
                line_cont = sr.ReadLine();
                if (line_cont == "")
                    line_cont = " ";
                result[i, j] = line_cont;
                j = (++j) % (result.GetLength(1));
                if (j == 0)
                    i++;
            }
            // 在vs2005中跟踪到这一步,所有数组元素赋值正常(全是字符串)
            Range body_range = op_worksheet.get_Range("A2", Missing.Value);
            body_range.get_Resize(ing_num, header_info.Length);
            body_range.Value2 = result;结果是只有A2一个格子的内容写入,而其他格子都是空的,到底为什么呢?

解决方案 »

  1.   

    try:
    Range body_range = op_worksheet.get_Range("A2", Missing.Value);
    ->
    Range body_range = op_worksheet.get_Range("A1", Missing.Value);
      

  2.   

    To:shitingzhao(孤单北半球) 
    在Range body_range = op_worksheet.get_Range("A2", Missing.Value);前我还有这段代码:
                object[] objHeaders = header_info;
                Range head_range = op_worksheet.get_Range("A1", "E1");
                head_range.set_Value(mv, objHeaders);
                head_range.Font.Bold = true;
    首先要把标题行加进去
    当然我试了你的方法把这段注释掉,然后把A2改成A1,但是没有用还是只写入了A1
      

  3.   

    补充:
    我在程序中添加了两个引用:
    .NET引用Microsoft.Office.Tool.Excel;
    COM引用Microsoft.Excel 11.0 Object Library (Ver 1.5)
    不知是否有影响
      

  4.   

    问题是出在这句话里,
    body_range.get_Resize(ing_num, header_info.Length);
    看看参数
      

  5.   

    To:livode(啊水)
    VS2005跟踪到body_range.get_Resize(ing_num, header_info.Length);执行前:
    ing_num = 1907, header_info.Length = 5
    不知哪里有问题呢?请指教
      

  6.   

    我试着直接写进去,但是无效还是只写入了A1
    再补充我的save代码(与微软示例一致):
                op_app.Visible = true;
                op_workbook.SaveAs(Environment.CurrentDirectory + @"\result.xls", 
                    mv, mv, mv, mv, mv, XlSaveAsAccessMode.xlNoChange, mv, mv, mv, mv, mv);
                op_workbook.Close(false, mv, mv);
                op_app.Quit();
    (其中mv是(object)Missing.Value)
    nnd,问题到底出在哪儿呢?
      

  7.   

    body_range.get_Resize(object row,object,col)
    他的两个参数都是object类型的,应该是类型转换时出的问题。
      

  8.   

    我觉得应该不是这里的问题吧,微软的示例在我这里工作成功,它不就是直接以数字为参数么?
    我刚才试过了直接body_range.get_Resize(1907, 5);但是没用啊
      

  9.   

    既然如此,楼主不妨看看这样。
    Object[,] result = new Object[ing_num, header_info.Length];
    //            int i = 0;
    //            int j = 0;
                // 从文件中读数据为数组赋值
    //            while (line_cont != null)
    //            {
    //                line_cont = sr.ReadLine();
    //                if (line_cont == "")
    //                    line_cont = " ";
    //                result[i, j] = line_cont;
    //                j = (++j) % (result.GetLength(1));
    //                if (j == 0)
    //                    i++;
    //            }
                // 在vs2005中跟踪到这一步,所有数组元素赋值正常(全是字符串)
                Range body_range = op_worksheet.get_Range("A2", Missing.Value);
                body_range.get_Resize(ing_num, header_info.Length);
    //            body_range.Value2 = result;
                body_range.select();
    看看选中的范围。
      

  10.   

    你写入的数据,必须保证每一列是同一类型。如果有一个是字符型的,那么同列中的其他数字型的数据就写不进EXCEL。就算已经正常存在数组里。我也遇上过,无论是导入,还是导出,好像都有这问题。强行指定EXCEL列的存储格式,为文本(什么数据都作为字符对待)。试试!!!
      

  11.   

    使用 Microsoft.Office.Tool.Excel;看看要不把
    Range body_range = op_worksheet.get_Range("A2", Missing.Value);
    body_range.get_Resize(ing_num, header_info.Length);换成
    Range body_range = op_worksheet.get_Range(op_worksheet.Get_Item(1,2),
    op_worksheet.Get_Item(ing_num+1,header_info.Length+2));
    看看
      

  12.   

    Object[,] result = new Object[ing_num, header_info.Length];
    //            int i = 0;
    //            int j = 0;
                // 从文件中读数据为数组赋值
    //            while (line_cont != null)
    //            {
    //                line_cont = sr.ReadLine();
    //                if (line_cont == "")
    //                    line_cont = " ";
    //                result[i, j] = line_cont;
    //                j = (++j) % (result.GetLength(1));
    //                if (j == 0)
    //                    i++;
    //            }
                // 在vs2005中跟踪到这一步,所有数组元素赋值正常(全是字符串)
                Range body_range = op_worksheet.get_Range("A2", Missing.Value);
                body_range.get_Resize(ing_num, header_info.Length);
    //            body_range.Value2 = result;
                body_range.select();
    看看选中的范围。
    如果范围没错,就是被注释掉的地方有问题。
      

  13.   

    多谢提示,我看过了果然在执行body_range.get_Resize(1907,5);之后,body_range居然是A2,A2
      

  14.   

    To:wolford() 
    多谢提示,但你可以看到我的代码里为result赋值的部分,显然result的所有元素都是stringTo:livode(啊水)
    看来是resize的问题,该如何解决呢?
      

  15.   

    ing_num, header_info.Length声明的部分也贴出来吧
      

  16.   

    op_workbook.Close(false, mv, mv);
    ->
    op_workbook.Close(true, mv, mv);
      

  17.   

    To:ofei(欧卡)
    我想试试你的方法,但我这里显示Microsoft.Office.Tools.Excel.Worksheet没有Get_Item方法
      

  18.   

    楼主,这段代码通过测试了,不知道你的如何?
    int a=101,b=3;
    object[,] objData = new Object[a, b];
    // Random rdm = new Random((int)DateTime.Now.Ticks);
    // double nOrderAmt, nTax;
    // for (int r = 0; r < 100; r++)
    // {
    // objData[r, 0] = "ORD" + r.ToString("0000");
    // nOrderAmt = rdm.Next(1000);
    // objData[r, 1] = nOrderAmt.ToString("c");
    // nTax = nOrderAmt * 0.07;
    // objData[r, 2] = nTax.ToString("c");
    // }
    Range range = excel.get_Range("A1",Type.Missing);//2005下此句需要修改
    range = range.get_Resize(a, b);
    // range.Value2 = objData;
    range.Select();
      

  19.   

    To:scow(怡红快绿)
    你的方法我以前就试过,不是那里的问题To:livode(啊水) ing_num, header_info.Length声明的部分也贴出来吧
    我现在的代码是body_range.get_Resize(1907,5);这时应该和上面的变量声明毫无关系了吧?
      

  20.   

    To:livode(啊水)
    很感谢你一直热心的帮助,这是我输出的全部代码:
                // output file: result xls file
                Application op_app = new Application();
                Workbooks op_workbooks = op_app.Workbooks;
                _Workbook op_workbook = op_workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                Sheets op_sheets = op_workbook.Worksheets;
                _Worksheet op_worksheet = (_Worksheet)op_sheets.get_Item(1);
                if (op_worksheet == null)
                {
                    Console.WriteLine("ERROR: worksheet: null reference");
                }
                object[] objHeaders = header_info;
                Range head_range = op_worksheet.get_Range("A1", "E1");//hard code
                head_range.set_Value(mv, objHeaders);
                head_range.Font.Bold = true;
                Range body_range = op_worksheet.get_Range("A2", Missing.Value);//hc
                body_range.get_Resize(1907, 5);//ing_num, header_info.Length
                body_range.Value2 = result;
                op_app.Visible = true;
                op_workbook.SaveAs(Environment.CurrentDirectory + @"\result.xls", 
                    mv, mv, mv, mv, mv, XlSaveAsAccessMode.xlNoChange, mv, mv, mv, mv, mv);
                op_workbook.Close(false, mv, mv);
                op_app.Quit();
    我觉得没什么理由不对了,但是那个bodyrange的size一直不对
      

  21.   

    Object[,] result = new Object[ing_num, header_info.Length];
    //            int i = 0;
    //            int j = 0;
                // 从文件中读数据为数组赋值
    //            while (line_cont != null)
    //            {
    //                line_cont = sr.ReadLine();
    //                if (line_cont == "")
    //                    line_cont = " ";
    //                result[i, j] = line_cont;
    //                j = (++j) % (result.GetLength(1));
    //                if (j == 0)
    //                    i++;
    //            }
                // 在vs2005中跟踪到这一步,所有数组元素赋值正常(全是字符串)
                Range body_range = op_worksheet.get_Range("A2", Missing.Value);
                body_range.get_Resize(ing_num, header_info.Length);
    //            body_range.Value2 = result;
                body_range.select();
    看看选中的范围。
    结果如何??
      

  22.   

    To:啊水:忘了提:
    你说的Range range = excel.get_Range("A1",Type.Missing);//2005下此句需要修改
    其中的excel是什么?
      

  23.   

    To:livode(啊水)
    注释掉body_range.Value2 = result;
    发现body_range仍然只有A2,A2一个格子
      

  24.   

    excel就是你的op_worksheet,我copy到我的环境的时候改了一下。
      

  25.   

    楼主,你先用微软示例代码(别忘了备份)
    object[,] objData = new Object[100, 3];
                Random rdm = new Random((int)DateTime.Now.Ticks);
                double nOrderAmt, nTax;
                for (int r = 0; r < 100; r++)
                {
                    objData[r, 0] = "ORD" + r.ToString("0000");
                    nOrderAmt = rdm.Next(1000);
                    objData[r, 1] = nOrderAmt.ToString("c");
                    nTax = nOrderAmt * 0.07;
                    objData[r, 2] = nTax.ToString("c");
                }
                Range range = worksheet.get_Range("A1", Missing.Value);
                range = range.get_Resize(100, 3);
                range.Value2 = objData;
    替换掉你的
    Object[,] result = new Object[ing_num, header_info.Length];
                int i = 0;
                int j = 0;
                // 从文件中读数据为数组赋值
                while (line_cont != null)
                {
                    line_cont = sr.ReadLine();
                    if (line_cont == "")
                        line_cont = " ";
                    result[i, j] = line_cont;
                    j = (++j) % (result.GetLength(1));
                    if (j == 0)
                        i++;
                }
                // 在vs2005中跟踪到这一步,所有数组元素赋值正常(全是字符串)
                Range body_range = op_worksheet.get_Range("A2", Missing.Value);
                body_range.get_Resize(ing_num, header_info.Length);
                body_range.Value2 = result;
    看看
      

  26.   

    唉,教训是惨痛地
    错误在这里:
    body_range.get_Resize(ing_num, header_info.Length);
    改为:
    body_range = body_range.get_Resize(ing_num, header_info.Length);
    fkfkfk~~~ 没法儿忍自己了
    多谢楼上的诸位
      

  27.   

    To:livode(啊水) 
    今天主要多谢你的帮助,如果方便的话加我MSN,以后可能还有问题与你交流 :)
    [email protected]
      

  28.   

    http://www.eimhe.com/bbs/adget.php?id=379765美河学习在线——专业视频课程下载基地