在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
2011-05-25 21:44
507 查看
public class Invoker
{
public SaveFileDialog InvokeDialog;
private Thread InvokeThread;
private DialogResult InvokeResult;
public Invoker()
{
InvokeDialog = new SaveFileDialog();
InvokeThread = new Thread(new ThreadStart(InvokeMethod));
InvokeThread.SetApartmentState(ApartmentState.STA);
InvokeResult = DialogResult.None;
}
public DialogResult Invoke()
{
InvokeThread.Start();
InvokeThread.Join();
return InvokeResult;
}
private void InvokeMethod()
{
InvokeResult = InvokeDialog.ShowDialog();
}
}
private void ExportExcel(SAPbouiCOM.Matrix ma)
{
int count = 0;
List<int> list = new List<int>();
for (int r = 0; r < ma.RowCount; r++)
{
SAPbouiCOM.CheckBox chkChoose = (SAPbouiCOM.CheckBox)ma.Columns.Item("Choose").Cells.Item(r + 1).Specific;
if (chkChoose.Checked == true)
{
list.Add(r);
count ++;
}
}
if (count == 0)
{
MessageBoxFrame("请选择一项!", 3, "OK", "", "", true);
return;
}
string saveFileName = "";
Invoker inv = new Invoker();
inv.InvokeDialog.DefaultExt = "xls";
inv.InvokeDialog.Filter = "Excel文件|*.xls";
inv.Invoke();
saveFileName = inv.InvokeDialog.FileName;
System.Reflection.Missing miss = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
excel.Application.Workbooks.Add(true); ;
excel.Visible = false;//若是true,则在导出的时候会显示EXcel界面。
if (excel == null)
{
MessageBoxFrame("EXCEL无法启动!", 3, "OK", "", "", true);
return;
}
Microsoft.Office.Interop.Excel.Workbooks books = (Microsoft.Office.Interop.Excel.Workbooks)excel.Workbooks;
Microsoft.Office.Interop.Excel.Workbook book = (Microsoft.Office.Interop.Excel.Workbook)(books.Add(miss));
Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet;
//写入标题
for (int i = 0; i < ma.Columns.Count - 2; i++)
{
excel.Cells[1, i + 1] = ma.Columns.Item(i + 2).Title;
}
//写入数值
for (int r = 0; r < list.Count; r++)
{
for (int i = 0; i < ma.Columns.Count - 2; i++)
{
excel.Cells[r + 2, i + 1] = ((SAPbouiCOM.EditText)ma.Columns.Item(i + 2).Cells.Item(list[r] + 1).Specific).Value;
}
}
excel.Columns.EntireColumn.AutoFit();//列宽自适应
if (inv.InvokeResult==DialogResult.Cancel)
{
return;
}
if (saveFileName == "")
{
MessageBoxFrame("请输入文件名!", 3, "OK", "", "", true);
return;
}
try
{
sheet.SaveAs(saveFileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
}
catch (Exception ex)
{
MessageBoxFrame(ex.ToString(), 3, "OK", "", "", true);
return;
}
book.Close(false, miss, miss);
books.Close();
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(books);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
GC.Collect();
MessageBoxFrame("数据导出成功!", 3, "OK", "", "", true);
}
{
public SaveFileDialog InvokeDialog;
private Thread InvokeThread;
private DialogResult InvokeResult;
public Invoker()
{
InvokeDialog = new SaveFileDialog();
InvokeThread = new Thread(new ThreadStart(InvokeMethod));
InvokeThread.SetApartmentState(ApartmentState.STA);
InvokeResult = DialogResult.None;
}
public DialogResult Invoke()
{
InvokeThread.Start();
InvokeThread.Join();
return InvokeResult;
}
private void InvokeMethod()
{
InvokeResult = InvokeDialog.ShowDialog();
}
}
private void ExportExcel(SAPbouiCOM.Matrix ma)
{
int count = 0;
List<int> list = new List<int>();
for (int r = 0; r < ma.RowCount; r++)
{
SAPbouiCOM.CheckBox chkChoose = (SAPbouiCOM.CheckBox)ma.Columns.Item("Choose").Cells.Item(r + 1).Specific;
if (chkChoose.Checked == true)
{
list.Add(r);
count ++;
}
}
if (count == 0)
{
MessageBoxFrame("请选择一项!", 3, "OK", "", "", true);
return;
}
string saveFileName = "";
Invoker inv = new Invoker();
inv.InvokeDialog.DefaultExt = "xls";
inv.InvokeDialog.Filter = "Excel文件|*.xls";
inv.Invoke();
saveFileName = inv.InvokeDialog.FileName;
System.Reflection.Missing miss = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
excel.Application.Workbooks.Add(true); ;
excel.Visible = false;//若是true,则在导出的时候会显示EXcel界面。
if (excel == null)
{
MessageBoxFrame("EXCEL无法启动!", 3, "OK", "", "", true);
return;
}
Microsoft.Office.Interop.Excel.Workbooks books = (Microsoft.Office.Interop.Excel.Workbooks)excel.Workbooks;
Microsoft.Office.Interop.Excel.Workbook book = (Microsoft.Office.Interop.Excel.Workbook)(books.Add(miss));
Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet;
//写入标题
for (int i = 0; i < ma.Columns.Count - 2; i++)
{
excel.Cells[1, i + 1] = ma.Columns.Item(i + 2).Title;
}
//写入数值
for (int r = 0; r < list.Count; r++)
{
for (int i = 0; i < ma.Columns.Count - 2; i++)
{
excel.Cells[r + 2, i + 1] = ((SAPbouiCOM.EditText)ma.Columns.Item(i + 2).Cells.Item(list[r] + 1).Specific).Value;
}
}
excel.Columns.EntireColumn.AutoFit();//列宽自适应
if (inv.InvokeResult==DialogResult.Cancel)
{
return;
}
if (saveFileName == "")
{
MessageBoxFrame("请输入文件名!", 3, "OK", "", "", true);
return;
}
try
{
sheet.SaveAs(saveFileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
}
catch (Exception ex)
{
MessageBoxFrame(ex.ToString(), 3, "OK", "", "", true);
return;
}
book.Close(false, miss, miss);
books.Close();
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(books);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
GC.Collect();
MessageBoxFrame("数据导出成功!", 3, "OK", "", "", true);
}
相关文章推荐
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。 多线程操作剪切板的时候。
- 其他信息:在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式
- 在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute
- 选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- (转)在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttr
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- 遇到的问题-----------c#在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- 遇到的问题-----------c#在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- ex = {"在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。 解决办法
- C#“必须先将当前线程设置为单个线程单元(STA)模式方可进行OLE调用”异常解决方案