Načítání dat z excelu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načítání dat z excelu – .NET – Fórum – Programujte.comNačítání dat z excelu – .NET – Fórum – Programujte.com

 

eximik0
Newbie
19. 11. 2012   #1
-
0
-

zdravím, potřebuju napsat program, ve kterém vyberu dvě XLS tabulky a následně pomocí nějakého algoritmu (pouze práce s daty) Vyexportuju určitý CSV soubor, který se dělí středníkama.

Problém mi nastává v případě když otevírám xls soubor na řádku s

Microsoft.Office.Interop.Excel.Workbook workBook1 = new Microsoft.Office.Interop.Excel.Workbook();

mi hlásí chybu

Načítání závodu třídy modelu COM pro komponentu s identifikátorem CLSID {00020819-0000-0000-C000-000000000046} se nezdařilo kvůli následující chybě : 80040154.

Vůbec nevím co s tím, zamrznul jsem... Dík za pomoc

Nahlásit jako SPAM
IP: 93.99.138.–
ingiraxo+15
Grafoman
19. 11. 2012   #2
-
0
-

excel podporuje ukladani primo do csv (pomoci stredniku)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
20. 11. 2012   #3
-
0
-

HRESULT 0x80040154 znamená Class not registered. Pokud na tom stroji, kde to zkoušíš, máš Excel nainstalovaný, tak potom už mě napadá jenom nastavit a přeložit projekt pro x86. A pokud ani to nepůjde, tak se asi budeš muset ponořit do registru.

Nahlásit jako SPAM
IP: 188.75.135.–
eximik0
Newbie
20. 11. 2012   #4
-
0
-

#3 liborb
Však ale já to kompiluju pod x86 a nainstalovaný excel tu taky mám (2010)

Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
20. 11. 2012   #5
-
0
-

No a ještě blbý dotaz, ale musí to být :) .... referenci máš přidanou?

Nahlásit jako SPAM
IP: 188.75.135.–
Vaizo0
Stálý člen
20. 11. 2012   #6
-
0
-
Nahlásit jako SPAM
IP: 85.93.127.–
eximik0
Newbie
20. 11. 2012   #7
-
0
-

Ne na tomdle mi to chybu nehází

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Exporter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //Globální proměnné pro import a export dat
        public String _file1; //In .xls
        public String _file2; //In .xls
        public String _file3; //Out .csv

        public Microsoft.Office.Interop.Excel.Application xls1;
        public Microsoft.Office.Interop.Excel.Application xls2;

        private void xlsFile1_Click(object sender, EventArgs e)
        {
            //Vyvoláme první Dialog pro výběr souboru
            DialogResult result = File1.ShowDialog();
            _file1 = File1.FileName;
            addLog("Vybrán soubor:" + _file1);
        }

        private void xlsFile2_Click(object sender, EventArgs e)
        {
            //Vyvoláme druhý Dialog pro výběr souboru
            DialogResult result = File2.ShowDialog();
            _file2 = File2.FileName;
            addLog("Vybrán soubor:" + _file2);
        }
        public void addLog(String txt)
        {
            log.Text = txt + "\n" + log.Text;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //Vyvoláme třetí Dialog pro výběr souboru
            //Začneme s Importem / Exportem samotných dat
            DialogResult result = File3.ShowDialog();
            _file3 = File3.FileName;
            addLog("Ukládám do:" + _file3);
 
            Microsoft.Office.Interop.Excel.Workbook workBook1 = new Microsoft.Office.Interop.Excel.Workbook();
                workBook1 = xls1.Workbooks.Open(_file1, 0, true,
                                                                                         5, "", "", true,
                                                                                         Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
                                                                                         "\t", false, false, 0, true, 1, 0);

            Microsoft.Office.Interop.Excel.Workbook workBook2 = xls2.Workbooks.Open(_file2, 0, true,
                                                                                         5, "", "", true,
                                                                                         Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
                                                                                         "\t", false, false, 0, true, 1, 0);

            Microsoft.Office.Interop.Excel.Worksheet workSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workBook1.Sheets[1];
            Microsoft.Office.Interop.Excel.Worksheet workSheet2 = (Microsoft.Office.Interop.Excel.Worksheet)workBook2.Sheets[1];

            object radek = 1;
            object sloupec = 1;

            Boolean quit = false;

            String get;

            while (!quit) {
                get = ((Microsoft.Office.Interop.Excel.Range)workSheet1.Cells[radek, sloupec]).Value2.ToString();
                quit = true;
            }
        }
    }
}
Nahlásit jako SPAM
IP: 93.99.138.–
eximik0
Newbie
20. 11. 2012   #8
-
0
-

#5 liborb
No blbej dotaz to není, ale přidával sem ji, ale nevim jak ověřit jestli tam je

'Exporter.vshost.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\14.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Exporter.vshost.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.Vbe.Interop\14.0.0.0__71e9bce111e9429c\Microsoft.Vbe.Interop.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
20. 11. 2012   #9
-
0
-

Tak reference jsou vidět v Solution Exploreru, ale podle mě by to mělo být nějak takto:

xls1 = new Microsoft.Office.Interop.Excel.Application();                                                                                     
Microsoft.Office.Interop.Excel.Workbook workBook1 = xls1.Workbooks.Open(...);

případně přes xls1.Workbooks.Add();

Nahlásit jako SPAM
IP: 188.75.135.–
eximik0
Newbie
20. 11. 2012   #10
-
0
-

   

xls1 = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workBook1 = new Microsoft.Office.Interop.Excel.Workbook();

A stejně ta samá chyba

Načítání závodu třídy modelu COM pro komponentu s identifikátorem CLSID {00020819-0000-0000-C000-000000000046} se nezdařilo kvůli následující chybě : 80040154.
Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
20. 11. 2012   #11
-
+1
-
Zajímavé

No jasně, že stejná chyba, protože ten řádek je špatně. Ono je to totiž tak, že máš komponentu Excel, v ní máš komponentu Workbook atd. Samostatně komponenta Workbook udělat nejde. Podívej se ještě jednou na ten můj předchozí příspěvek, ta hierarchie je prostě daná.

Nahlásit jako SPAM
IP: 188.75.135.–
eximik0
Newbie
21. 11. 2012   #12
-
0
-

joo, ujž to vidim já sem vůl, taková prkotina... :) Díky ti...

Mimochodem co znamená u

            object radek = 1;
            object sloupec = 1;

            Boolean quit = false;

            String get;

            while (!quit) {
                get = ((Microsoft.Office.Interop.Excel.Range)workSheet1.Cells[radek, sloupec]).Value2.ToString();
                quit = true;
            }

Chyba Odkaz na objekt není nastaven na instanci objektu. ? Projížděl sem dokumentaci ale takhle by to mělo fungovat... (Chyba je na řádku get = ((Micros.....)

Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
21. 11. 2012   #13
-
0
-

Nejspíš to bude null, takže to nejprve testovat:

if ((Microsoft.Office.Interop.Excel.Range)workSheet1.Cells[radek, sloupec]).Value2 != null) {
	...
}
Nahlásit jako SPAM
IP: 188.75.135.–
eximik0
Newbie
21. 11. 2012   #14
-
0
-

Já ted našel jendu vypadajíc easy-use knihovnu a to http://www.codeproject.com/…port-Library

Snažím se udělat export jendoho cellu na souřadnicích 1,1

            ExcelXmlWorkbook book1 = new ExcelXmlWorkbook();
            book1 = ExcelXmlWorkbook.Import(_file1);
            Worksheet sheet = book1[0];
            String get;

//get = sheet[1, 1].GetValue<String>;

Ale ted vubec nevím jak tu hodnotu dostat ven... Nemůžu najít žádnou metodu

našel jsem get = sheet[1, 1].GetValue<String>;

ale to mi hází chybku Error 1 Cannot convert method group 'GetValue' to non-delegate type 'string'. Did you intend to invoke the method? C:\Users\Stodulka.Jakub\Documents\Visual Studio 2008\Projects\Exporter\Exporter\Form1.cs 57 19 Exporter

Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
21. 11. 2012   #15
-
0
-
Nahlásit jako SPAM
IP: 188.75.135.–
liborb
~ Redaktor
+18
Guru
21. 11. 2012   #16
-
0
-
Nahlásit jako SPAM
IP: 188.75.135.–
eximik0
Newbie
21. 11. 2012   #17
-
0
-

Ano znam, příkladůje milion ale všecko je na export... Ted se peru s importem ://

Nahlásit jako SPAM
IP: 93.99.138.–
eximik0
Newbie
22. 11. 2012   #18
-
0
-

Tak, vše je funkční, ale když spustím program na jinym pc, tak mi to chce načíst referenci z mýho pc s mojí cestou... Jak tu referenci přiložit k buildu?

Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
22. 11. 2012   #19
-
0
-

Nejlépe relativní cestou (např. stejný adresář).

Nahlásit jako SPAM
IP: 188.75.135.–
Evzen+2
Návštěvník
22. 11. 2012   #20
-
0
-

Ahoj,

práce s interopem je velice ošidná. Ten jiný PC bude muset mít stejnou verzi Office. 

V referencích u projektu, kde máš přilinkovanou knihovnu pro práci s Excelem, tedy něco jako Microsoft.Office.Interop.Excel ve vlastnostech nastav "Copy local" na true.

Tím docílíš, že se ti po kompilaci zkopíruje toto DLLko do cílového adresáře.

Bacha na verze!  Verze 14 = Office 2010, Verze 12 = Office 2007. Mám takový pocit, že pokud přilinkuješ 14tku, tak ti to s Office 2007 běhat nebude, naopak pokud přilinkuješ 12., tak ti to poběží jak na 2007, tak i na 2010.

Jinak do excelu (pokud máš office) se dá dostat i jinak, např nastavením connection stringu přímo na excel a pak do souboru přistupuješ stejně jak k databázi, tedy přes selecty, inserty .. 

Jen pro inspiraci http://www.connectionstrings.com/excel

Další alternativou jsou knihovny třetích stran, např. můžu doporučit Gembox Spreadsheet, která je zatraceně jednoduchá, při určitých omezení zdarma a hlavně rychlá.

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
Vlada
~ Anonymní uživatel
5 příspěvků
24. 11. 2012   #21
-
0
-

a mam taky pocit, ze se mohou lisit pro ruzne jazykove verze (formaty). Jinak nacitani a ukladani je pomerne pomale.

Nahlásit jako SPAM
IP: 85.71.219.–
eximik0
Newbie
12. 12. 2012   #22
-
0
-

Zajímavý... Nevíte proč mi ten program po sobě nechává vždy cca 100procesů excel.exe? každej má 10M ram a nezavíraj se automaticky :/

Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
12. 12. 2012   #23
-
0
-

To je otázka, co přesně děláš. Řádek:

xls1 = new Microsoft.Office.Interop.Excel.Application();

zakládá novou instanci aplikace Excel. V programu ti většinou bude stačit jedna. A dále je zajímavé, co děláš na konci, jestli správně ukončuješ apod.

Nahlásit jako SPAM
IP: 188.75.135.–
eximik0
Newbie
12. 12. 2012   #24
-
0
-

Neukončuju nijak právě, nějak se mi to vykouřilo z hlavy, vim podstatná chyba..

Nivméně projížděl sem doc a nic typu xls1.close(); sem nenašel?

*edit: Tak koukám že xls1.Quit(); a xls2.Quit() tamm mám ale stejně se v procesech neukončujou

Nahlásit jako SPAM
IP: 93.99.138.–
liborb
~ Redaktor
+18
Guru
12. 12. 2012   #25
-
0
-

Je potřeba zavřít všechny sheety, listy a prostě všechno, co dostaneš. Je to COM, dostaneš instanci nějakého rozhraní, tj. provede se inkrementace počítadla referencí no a když pak všechno zase pěkně po sobě neuklidíš, tak se to prostě neuklidí. No a pak, protože tohle je .NET, tak je potřeba říct garbage collectoru, že fakt už chceš uklízet a na to je Marshal.ReleaseComObject.

Nahlásit jako SPAM
IP: 188.75.135.–
Evzen+2
Návštěvník
12. 12. 2012   #26
-
0
-

   

    using Microsoft.Office.Interop.Word;

    /// <summary>
    /// Trida, ktera usnadnuje praci s WordInterop knihovnou.
    /// </summary>
    public class WordInterop : IDisposable
    {
        #region Fields

        /// <summary>
        /// Reprezentace null objektu.
        /// </summary>
        protected static object NULLOBJECT = System.Reflection.Missing.Value;

        /// <summary>
        /// Reference na aplikaci.
        /// </summary>
        protected Application _application;

        /// <summary>
        /// Reference na dokument.
        /// </summary>
        protected Document _document;

        #endregion // Fields

// Tvuj vykonny kod v nejakych metodach

        #region CleanUp

        /// <summary>
        /// Ukonceni prace s Wordem pres Interop knihovnu.
        /// </summary>
        public void Dispose()
        {
            _document.Close(ref NULLOBJECT, ref NULLOBJECT, ref NULLOBJECT);
            _application.Quit(ref NULLOBJECT, ref NULLOBJECT, ref NULLOBJECT);

            // uzavreni dokumentu
            if (_document != null)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(_document);

            // ukonceni aplikace
            if (_application != null)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(_application);

            // _document.Close(ref NULLOBJECT, ref NULLOBJECT, ref NULLOBJECT);
            // _application.Quit(ref NULLOBJECT, ref NULLOBJECT, ref NULLOBJECT);

            _document = null;
            _application = null;
        }

        #endregion // CleanUp
    }

Je to sice pro Word, ale predpokladam, ze pro excel to nebude o moc jiny..

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
GAM
~ Anonymní uživatel
1 příspěvek
17. 7. 2017   #27
-
0
-

   

 
     Dim en As New CultureInfo("en-US")
            Thread.CurrentThread.CurrentCulture = en

            ' Creates a DateTime for the local time.
            Dim dt = DateTime.Now

            ' Converts the local DateTime to the UTC time.
            Dim utcdt As DateTime = dt.ToUniversalTime()

            ' Defines a custom string format to display the DateTime.
            ' zzz specifies the full time zone offset.

            Dim format As [String] = "dd-MM-yyyy"
            Dim SaveFormat As [String] = "yyyy_MM_dd"
            Dim FilterForm As [String] = "dd.M.yyyy"

            ' Converts the local time to a string
            ' using the custom format string and display.

            Dim str As [String] = dt.ToString(format)
            Dim strSave As [String] = dt.ToString(SaveFormat)
            Dim strAFilter As [String] = dt.ToString(FilterForm)

            Label1.Text = "Otevírám batchexport-134-" & str & ".xlsx"
            Dim oExcel As Object
            oExcel = CreateObject("Excel.Application")

            Dim fileTest As String = "D:\Download\batchexport-134-" & str & ".xlsx"

            'On Error GoTo NEEXISTUJE
            oExcel.Workbooks.Open(fileTest)

            Dim oBook As Microsoft.Office.Interop.Excel.Workbook
            Dim oSheet As Microsoft.Office.Interop.Excel.Worksheet

            oBook = oExcel.ActiveWorkbook
            oSheet = oExcel.Worksheets(1)

            ' Úprava souboru mazaní sloupců, upravování formátu v buňkách doplnění textu
            Label1.Text = "Mažu sloupce..."
            oSheet.Range("A:A").EntireColumn.Delete()
            oSheet.Range("A:A").EntireColumn.Delete()
            oSheet.Range("A:A").EntireColumn.Delete()
            oSheet.Range("A:A").EntireColumn.Delete()
            oSheet.Range("C:C").EntireColumn.Delete()
            oSheet.Range("F:F").EntireColumn.Delete()
            oSheet.Range("H:H").EntireColumn.Delete()
            oSheet.Range("H:H").EntireColumn.Delete()
            oSheet.Range("H:H").EntireColumn.Delete()
            oSheet.Range("I:I").EntireColumn.Delete()
            oSheet.Range("I:I").EntireColumn.Delete()
            oSheet.Range("I:I").EntireColumn.Delete()
            oSheet.Range("K:K").EntireColumn.Delete()
            oSheet.Range("L:L").EntireColumn.Delete()
            oSheet.Range("L:L").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Delete()
            oSheet.Range("M:M").EntireColumn.Clear()

            '' AutoFiltry in Excel
            oSheet.Range("A:N").AutoFilter(Field:=1, [Operator]:=XlAutoFilterOperator.xlFilterDynamic, [Criteria1]:=XlDataSeriesDate.xlDay)
            oSheet.Range("A:N").AutoFilter(Field:=4, Criteria1:="prodáno 1. balíček")

            '' nadpis buňky
            oSheet.Range("M1").Value = "e-mail"
            '' přidání listu
            Label1.Text = "Přidávám list"
            oBook.Worksheets.Add(After:=oBook.Sheets(oBook.Sheets.Count)).Name = ("batchexports-134-" & str) ' Přidání listu za existující
            'oBook.Sheets.Add() (jednoduché přidání listu)

            Clipboard.Clear()

            '' vybrání a zkopírování dat z listu na list listu
            Label1.Text = "Kopíruji data do nového listu a zpět..."
            oBook.Sheets("batchexport-134-" & str).Range("A:N").Copy
            oBook.Sheets("batchexports-134-" & str).Range("A:N").PasteSpecial(XlPasteType.xlPasteValues, , False, False)
            oBook.Sheets("batchexport-134-" & str).Select
            Label1.Text = "Vypínám filtry..."
            oBook.Sheets("batchexport-134-" & str).AutoFilterMode = False
            Label1.Text = "Mažu napotřebná data..."
            oSheet.Range("A:N").Clear()
            oBook.Sheets("batchexports-134-" & str).Range("A:N").Copy
            oBook.Sheets("batchexport-134-" & str).Range("A:N").PasteSpecial(XlPasteType.xlPasteValues, , False, False)
            oBook.Worksheets(2).Delete()
            oBook.Sheets("batchexport-134-" & str).Select
            oSheet.Range("A1").Select()

            Label1.Text = "Formátuji buňky..."
            oSheet.Range("A:A").EntireColumn.NumberFormat = "d/m/yyyy h:mm;@"
            oSheet.Range("E:E").EntireColumn.NumberFormat = "d/m/yyyy h:mm;@"
            oSheet.Range("H:H").EntireColumn.NumberFormat = "0"
            oSheet.Range("L:L").Replace(" ", "")
            oSheet.Range("M:M").EntireColumn.ColumnWidth = 20
            ' Automatická šíře buňky
            oSheet.Range("A:A").EntireColumn.AutoFit()
            oSheet.Range("D:D").EntireColumn.AutoFit()

            'My.Computer.Clipboard.SetText(Clipboard.ContainsText, System.Windows.Forms.TextDataFormat.Rtf)

            ' Uložení souboru
            Label1.Text = "Ukládám soubor" & str & "_prodeje.xls"
            oExcel.DisplayAlerts = False
            oBook.SaveAs("D:\Download\" & strSave & "_prodeje.xlsx", 51) ' 51 == xlsx
            oBook.Close()
            oBook = Nothing
            Label1.Text = "Uloženo jako D:\Download\" & str & "_prodeje.xls"
            Label1.Text = "Report byl úspěšně vytvořen. Nezapomeň dodat e-maily!"
            GoTo KONEC
    NEEXISTUJE:
            Label1.Text = "Chyba v běhu programu."
            MessageBox.Show("Chyba v běhu programu. Číslo chyby: " & Err.Number & " " & Err.Description, "Report Excel Creator", MessageBoxButtons.OK, MessageBoxIcon.Information)
            REM End
    KONEC:


Moje práce s časem a excelem ve Visual Studio 2015. Třeba to někomu pomůže.

Nahlásit jako SPAM
IP: 109.81.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Načítání dat z Excelu — založil Eirene

Import dat z Excelu — založil greppi

Export dat do excelu — založil Láda

Export dat z excelu — založil xJakubS

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý