我有一个已赋值的二维数组,想将其写入新建的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一个格子的内容写入,而其他格子都是空的,到底为什么呢?
微软的示例代码:
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一个格子的内容写入,而其他格子都是空的,到底为什么呢?
Range body_range = op_worksheet.get_Range("A2", Missing.Value);
->
Range body_range = op_worksheet.get_Range("A1", Missing.Value);
在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
我在程序中添加了两个引用:
.NET引用Microsoft.Office.Tool.Excel;
COM引用Microsoft.Excel 11.0 Object Library (Ver 1.5)
不知是否有影响
body_range.get_Resize(ing_num, header_info.Length);
看看参数
VS2005跟踪到body_range.get_Resize(ing_num, header_info.Length);执行前:
ing_num = 1907, header_info.Length = 5
不知哪里有问题呢?请指教
再补充我的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,问题到底出在哪儿呢?
他的两个参数都是object类型的,应该是类型转换时出的问题。
我刚才试过了直接body_range.get_Resize(1907, 5);但是没用啊
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();
看看选中的范围。
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));
看看
// 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();
看看选中的范围。
如果范围没错,就是被注释掉的地方有问题。
多谢提示,但你可以看到我的代码里为result赋值的部分,显然result的所有元素都是stringTo:livode(啊水)
看来是resize的问题,该如何解决呢?
->
op_workbook.Close(true, mv, mv);
我想试试你的方法,但我这里显示Microsoft.Office.Tools.Excel.Worksheet没有Get_Item方法
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();
你的方法我以前就试过,不是那里的问题To:livode(啊水) ing_num, header_info.Length声明的部分也贴出来吧
我现在的代码是body_range.get_Resize(1907,5);这时应该和上面的变量声明毫无关系了吧?
很感谢你一直热心的帮助,这是我输出的全部代码:
// 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一直不对
// 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();
看看选中的范围。
结果如何??
你说的Range range = excel.get_Range("A1",Type.Missing);//2005下此句需要修改
其中的excel是什么?
注释掉body_range.Value2 = result;
发现body_range仍然只有A2,A2一个格子
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;
看看
错误在这里:
body_range.get_Resize(ing_num, header_info.Length);
改为:
body_range = body_range.get_Resize(ing_num, header_info.Length);
fkfkfk~~~ 没法儿忍自己了
多谢楼上的诸位
今天主要多谢你的帮助,如果方便的话加我MSN,以后可能还有问题与你交流 :)
[email protected]