真心求教Excel高手(一个星期没解决的问题)

Lixin19821010 2008-04-11 05:23:43
private void isHaveA2Comment()
{
string file = templateTree.SelectedNode.Tag.ToString();//得到路径

Excel.Range rngA2;
workbook = ExcelEngine.Current.GetWorkbook(file);//得到workBook
Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
rngA2 = worksheet.get_Range("A2", Missing.Value);
if (rngA2.Comment == null)//如果sheet1的rngA2为空,则给每个sheet的A2加上批注
{
for (int i = 1; i < workbook.Worksheets.Count + 1; i++)
{
worksheet = (Worksheet)workbook.Sheets[i];
string worksheetName = worksheet.Name.ToString();
rngA2 = worksheet.get_Range("A2", Missing.Value);
if (...)
{
rngA2.AddComment("1,unitId");
}
else if (...)
{
rngA2.AddComment("2,rows");
}
else if (...)
{
rngA2.AddComment("3,rows");
}
else
{
rngA2.AddComment("0,");
}
}
workbook.Close(true, Missing.Value, Missing.Value);
//workbook.Save();
}
}
...全文
218 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lixin19821010 2008-04-13
  • 打赏
  • 举报
回复
是不是你添加引用的版本与你打开的版本不对

这个不是的,不是这方面的问题.

我想可能是别的线程占用了,两个线程同时操作,垃圾释放不合理导致的.
只是实在找不出问题.
也不知道是和哪个线程冲突.找不到....

挺郁闷的

不过很开心的是大家都能提供帮助.十分感谢大家.大家的建议和代码我都会仔细考虑和阅读的.十分感谢
Lixin19821010 2008-04-13
  • 打赏
  • 举报
回复
Excel里面的第一个SHEET表单是从1开始的,和平时我们大家用的数组不太一样(从0开始).
Lixin19821010 2008-04-12
  • 打赏
  • 举报
回复
肯定是我的代码有问题.就是找不出来.
OFFICE是肯定没有问题的.
打开其他的EXCEL,并进行操作,比如新建立一个项目,完全COPY上面代码
可以在EXCEL里面的SHEET全部加上COMMENT,
但是就是我的在项目里面的这些代码不顶事.实在是烦恼啊
Lixin19821010 2008-04-12
  • 打赏
  • 举报
回复
这里不能QUIT(),因为我处理完毕后,还需要进行别的操作,所以不能推出.
但是程序全部推出之后自然调用这个QUIT().
退出之后,我的WINDOW资源管理器里并没有EXCEL进程.
但是就是所操作的EXCEL文件打不开.总是报错.
但是用程序读,程序写这个模板文件,都没有任何问题.
Lixin19821010 2008-04-12
  • 打赏
  • 举报
回复
ExcelEngine里面就是对一些方法进行了封装,其实都是workbook里面所自带的方法.另外加一点点参数,得到workbook,worksheet,保存work,worksheet等.其实没什么大的不同的地方.
huaer1011 2008-04-12
  • 打赏
  • 举报
回复
支持下~
没感觉哪有错误
duping9626 2008-04-12
  • 打赏
  • 举报
回复
是不是你添加引用的版本与你打开的版本不对
viki117 2008-04-12
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Files/viki117/ExeclTool.rar
试下这个人家做好的EXECL的DLL工具。。
方法里面也写了。。方便多了。。
yunfeng007 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Lixin19821010 的回复:]
肯定是我的代码有问题.就是找不出来.
OFFICE是肯定没有问题的.
打开其他的EXCEL,并进行操作,比如新建立一个项目,完全COPY上面代码
可以在EXCEL里面的SHEET全部加上COMMENT,
但是就是我的在项目里面的这些代码不顶事.实在是烦恼啊
[/Quote]
那就说明这段代码没什么问题,是你项目中其他部分代码有问题。而且ExcelEngine应该也没什么问题,你在看看其它部分的代码吧,看看在执行这些代码前和代码后到底做了什么事情.
liujunhappy2005 2008-04-12
  • 打赏
  • 举报
回复
点看不懂:为什么要先从sheet[1](workbook.Worksheets[1])开始,应该从sheet[0]开始吧

live_7sky 2008-04-11
  • 打赏
  • 举报
回复
我自己写的程序 ,测试 OK

给你参考一下

/// <summary>
/// 导出数据到Excel+backgroundWorker1
/// </summary>
/// <param name="TasksData">数据源</param>
/// <param name="HeadName">显示标题的集合</param>
/// <param name="ColumnName">显示的列的结合</param>
/// <param name="WorkBookName">工作表的名字</param>
/// <param name="FileName">保存Excel文件的名字</param>
public void ExportTasks(DataSet TasksData, ArrayList heads, ArrayList columns, string WorkBookName, string FileName)
{
// 定义要使用的Excel 组件接口
// 定义Application 对象,此对象表示整个Excel 程序
Microsoft.Office.Interop.Excel.Application excelApp = null;
// 定义Workbook对象,此对象代表工作薄
Microsoft.Office.Interop.Excel.Workbook workBook;
// 定义Worksheet 对象,此对象表示Execel 中的一张工作表
Microsoft.Office.Interop.Excel.Worksheet ws = null;
//定义Range对象,此对象代表单元格区域
// Microsoft.Office.Interop.Excel.Range r;

int row = 1; int cell = 1;
int dcell = 1;
try
{
//初始化 Application 对象 excelApp
excelApp = new Microsoft.Office.Interop.Excel.Application();
//在工作薄的第一个工作表上创建任务列表
workBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
ws = (Worksheet)workBook.Worksheets[1];

// 命名工作表的名称为
ws.Name = WorkBookName;
//创建标题
for (int headindex = 0, headcount = heads.Count; headindex < headcount; headindex++)
{
ws.Cells[row, cell] = heads[headindex].ToString();

//设置Excel 标题样式
//Range rghead = r = (Range)ws.get_Range(ws.Cells[row, cell], ws.Cells[row, cell]);
//rghead.EntireColumn.Font.Bold = true;
//rghead.EntireColumn.Font.Size = 14;
//rghead.EntireColumn.Font.ColorIndex = 3;
//rghead.EntireColumn.HorizontalAlignment = XlHAlign.xlHAlignLeft;
//rghead.EntireColumn.AutoFit();

cell++;
}

// 创建行,把数据视图记录输出到对应的Excel 单元格

for (int i = 0, rowcount = TasksData.Tables[0].Rows.Count; i < rowcount; i++)
{
dcell = 1;

for (int k = 0, columnNamecount = columns.Count; k < columnNamecount; k++)
{
for (int j = 0, columncount = TasksData.Tables[0].Columns.Count; j < columncount; j++)
{
if (TasksData.Tables[0].Columns[j].ColumnName==columns[k].ToString())
{
ws.Cells[i + 2, dcell] = TasksData.Tables[0].Rows[i][j].ToString() + "\r";

Range rg = (Range)ws.get_Range(ws.Cells[i + 2, dcell], ws.Cells[i + 2, dcell]);
//设置为文本格式
if (TasksData.Tables[0].Rows[i][j].GetType().Name == "DateTime")
{
rg.NumberFormat = "yyyy-MM-dd HH:mm:ss";
}
else
{
rg.NumberFormatLocal = "@";
}
rg.EntireColumn.AutoFit();
dcell++;
break;
}
}

}
// }
}

//显示 Excel
//excelApp.Visible = true;
// 或者直接保存
workBook.Saved = true;
workBook.SaveCopyAs(FileName);
ws = null;
workBook = null;
excelApp = null;

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
//页面调用
//private void button1_Click(object sender, EventArgs e)
//{
// backgroundWorker1.RunWorkerAsync();
//}

//private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
//{
// Print p = new Print();
// p.ExportTasks(ds, "客户编号,员工编号,船名字", "CustomerID,EmployeeID,OrderDate", "s", "e:\\1.XLS");
//}

//private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
//{
// MessageBox.Show("数据导出成功!");
//}
}
}
}
live_7sky 2008-04-11
  • 打赏
  • 举报
回复


你用 office 打开其他 excel 文件有问题吗 ?
没有的话,就是你代码 的问题 。
live_7sky 2008-04-11
  • 打赏
  • 举报
回复


没有见过 这样的问题:
会不会是 保存 的方式 出错了扼
//保存方式一:保存WorkBook
//workbook.SaveAs(@"F:\CData.xls",
// 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);

//保存方式二:保存WorkSheet
// worksheet.SaveAs(@"F:\CData2.xls",
// Missing.Value, Missing.Value, Missing.Value, Missing.Value,
// Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

////保存方式三
//workbook.Saved = true;
//workbook.SaveCopyAs(sfd.FileName);


System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
worksheet = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
workbooks = null;
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
excelApp = null;
MessageBox.Show("导出Excel完成!");
}
}

tanxiaolin520 2008-04-11
  • 打赏
  • 举报
回复
excel不用quit的啊.

要不重装下EXCEL看看吧
lovehongyun 2008-04-11
  • 打赏
  • 举报
回复
excelapp用完了quit一下试试
excelApp.Quit();
badtank 2008-04-11
  • 打赏
  • 举报
回复
貌似处理Excel的内容都在ExcelEngine里,什么代码?
Lixin19821010 2008-04-11
  • 打赏
  • 举报
回复
我的问题:我每次运行,编辑,退出,等等都是没有问题的.都是可以运行,并且运行结果良好.
退出之后,在WINDOWS资源管理器里也不存在未释放的EXCEL进程.
但是就是打开不了我的EXCEL的模板文件.打开就抱错,叫我恢复......

请教各位高手.
十分感谢

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧