多线程操作EXCEL问题求教

marswangbo 2014-08-05 05:11:08
如下程序,开两个线程,向同一个worksheet中的不同行写入数据,
在第一遍执行的时候,两个线程中会随机有一个线程报错,再次执行就正常了,求高手指点。


class ExPara
{
private Microsoft.Office.Interop.Excel.Worksheet _WorkSheet;

public Microsoft.Office.Interop.Excel.Worksheet WorkSheet
{
get { return _WorkSheet; }
set { _WorkSheet = value; }
}

private int _StartRow;

public int StartRow
{
get { return _StartRow; }
set { _StartRow = value; }
}

private String _Value;

public String Value
{
get { return _Value; }
set { _Value = value; }
}
}

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private int x = 2;//线程计数,完成一个减一
Microsoft.Office.Interop.Excel.Application ex;
Microsoft.Office.Interop.Excel.Workbook wb;
Microsoft.Office.Interop.Excel.Worksheet ws;
/// <summary>
/// 开始程序
/// </summary>
private void ThreadExcel()
{
try
{
ex = new Microsoft.Office.Interop.Excel.Application();
wb = ex.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];

x = 2;
Thread t1 = new Thread(new ParameterizedThreadStart(T));
ExPara e1 = new ExPara();
e1.WorkSheet = ws;
e1.StartRow = 1;
e1.Value = "测试线程1";
t1.Start(e1);

Thread t2 = new Thread(new ParameterizedThreadStart(T));
ExPara e2 = new ExPara();
e2.WorkSheet = ws;
e2.StartRow = 5;
e2.Value = "测试线程2";
t2.Start(e2);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}

/// <summary>
/// 执行
/// </summary>
/// <param name="ex"></param>
private void T(object ex)
{
try
{
ExPara e = ex as ExPara;
(ws.Cells[e.StartRow, 1] as Microsoft.Office.Interop.Excel.Range).Value2 = e.Value;
}
catch (Exception e1)
{
MessageBox.Show((ex as ExPara).Value);
MessageBox.Show(e1.Message);
}
finally
{
x--;
ShowExcel();
}
}

/// <summary>
/// 显示表格
/// </summary>
private void ShowExcel()
{
try
{
if (x == 0)
{
ex.Visible = true;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
if (x == 0)
{
if (ws != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
if (wb != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
if (ex != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(ex);
GC.Collect();
}
}
}
}
...全文
647 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sry412406 2016-10-11
  • 打赏
  • 举报
回复
后来解决了吗
kiba_zwei 2016-02-19
  • 打赏
  • 举报
回复
引用 8楼一剑枯荣 的回复:
c#可以用多线程向同一个工作簿中的多个工作本写数据吗?
我也有这个问题,有好多个worksheet,一个个写太慢了。。
一剑枯荣 2015-01-16
  • 打赏
  • 举报
回复
c#可以用多线程向同一个工作簿中的多个工作本写数据吗?
marswangbo 2014-08-06
  • 打赏
  • 举报
回复
引用 5 楼 jshi123 的回复:
excel对象模型不是线程安全的。虽然多线程工作的可能性是有的,但是强烈建议不这么做,会有很多问题。 在t1,t2启动前,要把线程设为STA: t.SetApartmentState(System.Threading.ApartmentState.STA); t.Start(); STA模式下,调用是顺序执行的,调用线程可能会阻塞一会,所以速度也会比较慢。 参考:http://msdn.microsoft.com/en-us/library/8sesy69e%28v=vs.100%29.aspx
额 。。问题依旧,看来这玩意还是不太适合多线程。。我还是放弃多线程操作这个吧。。哈哈,本来是想在一个工作表里面的不同位置同时写入数据省点时间的呢。。感谢指点。。
marswangbo 2014-08-06
  • 打赏
  • 举报
回复
引用 5 楼 jshi123 的回复:
excel对象模型不是线程安全的。虽然多线程工作的可能性是有的,但是强烈建议不这么做,会有很多问题。 在t1,t2启动前,要把线程设为STA: t.SetApartmentState(System.Threading.ApartmentState.STA); t.Start(); STA模式下,调用是顺序执行的,调用线程可能会阻塞一会,所以速度也会比较慢。 参考:http://msdn.microsoft.com/en-us/library/8sesy69e%28v=vs.100%29.aspx
我来试试,感谢。
jshi123 2014-08-06
  • 打赏
  • 举报
回复
excel对象模型不是线程安全的。虽然多线程工作的可能性是有的,但是强烈建议不这么做,会有很多问题。 在t1,t2启动前,要把线程设为STA: t.SetApartmentState(System.Threading.ApartmentState.STA); t.Start(); STA模式下,调用是顺序执行的,调用线程可能会阻塞一会,所以速度也会比较慢。 参考:http://msdn.microsoft.com/en-us/library/8sesy69e%28v=vs.100%29.aspx
祥子爱游戏 2014-08-05
  • 打赏
  • 举报
回复
次奥,我为什么要加
祥子爱游戏 2014-08-05
  • 打赏
  • 举报
回复
我也觉得多线程写读同一个文件不怎么样?
zhouzangood 2014-08-05
  • 打赏
  • 举报
回复
mlqxj35674 2014-08-05
  • 打赏
  • 举报
回复
没细看,凭直觉,要通过多线程写Excel,该XLS文件可能要设置为共享,

110,533

社区成员

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

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

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