Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Wayne
Člen
Avatar
Wayne:17.12.2019 14:11

Ahoj,

nemá někdo zkušenost s touto knihovnou? Při použití mi to padá na řádku kde inicializuju excelWorkBook.

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook excelWorkBook = excelApp.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = excelWorkBook.Sheets[1];
Microsoft.Office.Interop.Excel.Range xlRange = xlWorksheet.UsedRange;

Vrátí mi to tuto hlášku
System.Runtime­.InteropServi­ces.COMExcepti­on: 'Exception from HRESULT: 0x800AC472'

Chci docílit: Dělám metodu na export dat do excelu a tato knihovna se mi líbí že toho spoustu dělá za mě.

 
Odpovědět
17.12.2019 14:11
Avatar
Odpovídá na Wayne
Michal Štěpánek:17.12.2019 18:16

Používám tu knihovnu celkem často. Nechtělo se mi dlouze pátrat, jak vytvářet nový soubor, tak jsem si udělal "šablonu" (jen uložený prázdný sešit) a ten otevírám takto

//otevřít excel
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Open(System.IO.Path.Combine(cesta + "Prazdny.xls"));
Microsoft.Office.Interop.Excel.Worksheet sheet = wb.Worksheets[1];
            sheet.Range["A1"].Value = "Linka";
            sheet.Range["B1"].Value = "Budova";
            sheet.Range["C1"].Value = "Název";

do dalších řádků a buněk data z DB a funguje to bez problémů...

Nahoru Odpovědět
17.12.2019 18:16
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Wayne
Michal Štěpánek:17.12.2019 18:21

Zapomněl jsem dodat, že ten export pouštím pomocí Backgroundworkeru v jiném vlákně...

Nahoru Odpovědět
17.12.2019 18:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
paja
Člen
Avatar
Odpovídá na Wayne
paja:17.12.2019 18:47

Ahoj ,

1/ Zkus pridat knihovnu interopp, jak je na obrazku
2/ spustit priklad kodu

Me to funguje bez problemu :-)

Good Luck :-)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Office.Interop.Excel;
using _Excel = Microsoft.Office.Interop.Excel;

namespace interoppcons
{

    class Program
    {
        static void Main(string[] args)
        {
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Visible = true;
            Microsoft.Office.Interop.Excel.Workbook excelWorkBook = excelApp.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = excelWorkBook.Sheets[1];
            Microsoft.Office.Interop.Excel.Range xlRange = xlWorksheet.UsedRange;
 
Nahoru Odpovědět
17.12.2019 18:47
Avatar
Wayne
Člen
Avatar
Odpovídá na paja
Wayne:17.12.2019 19:01

Když jsem přidal referenci, tak mi to stále nefunguje, tentokrát to vyhazuje tuto chybu

*System.Runti­me.InteropSer­vices.COMExcep­tion: 'Microsoft Excel cannot open or save any more documents because there is not enough available memory or disk space. *

Místa na disku mám však dost

 
Nahoru Odpovědět
17.12.2019 19:01
Avatar
paja
Člen
Avatar
Odpovídá na Wayne
paja:17.12.2019 21:52

Tezko rict presne co by to mohlo byt jedno z moznych reseni muze byt toto:

napred checknul bych excel jako tady

https://rsw.tv/…-disk-space/

popr toto:

https://www.codeproject.com/…-app-using-c

Kazdopadne drzim palce :-)

 
Nahoru Odpovědět
17.12.2019 21:52
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Wayne
Bugmaster:21.12.2019 1:29

Vím že to není odpověd na otázku, ale neodpustím si napsání jednoho poznatku z praxe:

Pokud nemáš hodně drobrej důvod k používání Office Interopt, tak to nedělej. Pokud jen potřebuješ jen vygenerovat sešit Excelu, existují lepší metody.

Proč nepoužívat Office Interopt?

  • Na počítači, kde to spouštíš, musí být nainstalovaný Office (AFAIK).
  • Nelíbí se mi dokumentace a obecně jak se to používá.
  • Neměřil jsem to, ale přijde mi to pomalší, než alternativní řešení.
  • Občas to vyhazuje divný chyby (ehm...).

Pro tyhle účely se mi osvědčila knihovna ClosedXML. Její použití je fakt snadný.

Editováno 21.12.2019 1:32
 
Nahoru Odpovědět
21.12.2019 1:29
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Wayne
Jirka Jr:21.12.2019 9:59

zkusil jsem googlit, jelikoz nemam MS Office na kompu a pridavam do hry svou kristalovou kouli ;-)

1. problem je v pravech na slozku, kam si Excel zapisuje autosave soubory

  • zkus najit, kam Excel uklada autosave soubory (nechce se mi to zjistovat :-) )
  • potom pred zacatek tveho kodu dej kod, ktery otevre obyc. textovy soubor pro zapis
  • pokud nepujde zapsat ani ten textovy soubor, tak se mrkni do toho autosave adresare na prava, jestli tam muzes vytvaret soubory, zapisovat do souboru, mazat, atd.

2. problem je v tom, ze Ecel pracuje ve vice vlaknech a je potreba pockat, "nez se vzpamatuje"

  • uzavri tvorbu sesitu do try - catch a odchytavej vyjimku , dokud se neprobere
  • kod jsem napsal jen tak bez testovani, takze ho ber spis, jako nastin
  • ve for cyklu muzes zkusit zmenit maximum iteraci z 10 na vic nebo Sleep z 500 na vic a uvidis, jestli to nejak pomuze nebo ne
....

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = false;

bool skonci=false;
for(int i=0;(i<10) && (skonci==false);i++)
{
        try
        {
                Microsoft.Office.Interop.Excel.Workbook excelWorkBook = excelApp.Workbooks.Add(Type.Missing);
                skonci=true;
        }
        catch(System.Runtime.InteropServices.COMException e)
        {
                System.Threading.Thread.Sleep(500);
        }
}

Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = excelWorkBook.Sheets[1];
Microsoft.Office.Interop.Excel.Range xlRange = xlWorksheet.UsedRange;

....
Editováno 21.12.2019 10:00
 
Nahoru Odpovědět
21.12.2019 9:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.