Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - 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í.
discount 30 + hiring
Avatar
David Mrázek:20.11.2020 10:58

Zdravím, jsem úplně bezradný. Vůbec nedokážu projet celý excel soubor buňku po buňce, vždy mi vyskočí nějaká chyba. Budu rád za každou pomoc a radu, řeším to už hrozně dlouho....
Děkuji všem a přeji hezký den :-)

Zkusil jsem: Form1:

using System;
using System.IO;
using System.Windows.Forms;


namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFile();
        }

        public void OpenFile()
        {
            Class1 excel = new Class1(@"C:\Users\info\Documents\Zkouska.xlsx",1) ;
            string path = @"C:\Users\info\Documents\new.txt";
            TextWriter tw = new StreamWriter(path, true);

           tw.Write(excel.ReadCell(0, 0));
        }
    }
}

Class1:

using Microsoft.Office.Interop.Excel;
using _Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsApp2
{
    class Class1
    {
        string path = "";
        _Application excel = new _Excel.Application();
        Workbook wb;
        Worksheet ws;

        public Class1(string path, int Sheet)
        {
            this.path = path;
            wb = excel.Workbooks.Open(path);
            ws = (Worksheet)wb.Worksheets[Sheet];
        }
        public string ReadCell(int i, int j)
        {
            i++;
            j++;
            if ((ws.Cells[i] == "Z_KomSilnice_L (24200)/7 ")) //Zde vyskočí chyba "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator '==' cannot be applied to operands of type 'System.__ComObject' and 'string''"
            //já myslel že string to normálně najde, nebo je lepší do toho dát Contains(String)?
            {
                return ws.Cells[i, j++];
            }
            else
                return "";
            }
    }
}

Chci docílit: Snažím se vyhledat v .xlsx souboru string a zkopírovat buňku vedle hledaného stringu. Excel soubor má pouze jeden list.
Kroky jsem si rozdělil následovně:
1.Otevřít/načíst Excel soubor
2.Najít buňku
3.Vytvořit textový dokument
4. Napsat zkopírovanou hodnotu pomocí streamwriteru

Odpovědět
20.11.2020 10:58
kde je vůle, tam je cesta
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.11.2020 15:58

Kdysi jsem si hral s necim podobnym. Nakonec jsem to poresil jinak. Excel si tusim pro kazdy radek uklada pocet otevrenych bunek. Muze se to lisit. Kdyz tam das 80, a on ma otevrenych 79, tak to vyhodi error.

1. Doporucuji zkusit googlem hledat jiz hotove scripty.

https://www.extendoffice.com/documents/excel/612-excel-export-data-to-text.html

Sub ExportRangetoFile()
'Update 20130913
        Dim wb As Workbook
        Dim saveFile As String
        Dim WorkRng As Range
        On Error Resume Next
        xTitleId = "KutoolsforExcel"
        Set WorkRng = Application.Selection
        Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        Set wb = Application.Workbooks.Add
        WorkRng.Copy
        wb.Worksheets(1).Paste
        saveFile = Application.GetSaveAsFilename(fileFilter:="Text Files (*.txt), *.txt")
        wb.SaveAs Filename:=saveFile, FileFormat:=xlText, CreateBackup:=False
        wb.Close
        Application.CutCopyMode = False
        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
End Sub

2. A nebo pouzij export do text/csv, to je take textovy format.
3. Excel umi ukladat makra, kde ti ulozi cely kod pro ulozeni do SaveAs txt, pripadne oznaceni urcite oblasti a save as txt.
To jsem hodne pouzival, kdyz jsem potreboval vygenerovat z excelove tabulky (text/csv export dat z naseho informacniho systemu) samostatne listy pro uzivatele, aby nam tam doplnili schazejici udaje. Kazdy radek jako extra formular. Formular jsem mel pripraveny, jen jsem kazdy radek rozkopirovat do policek pro vyplneni. A pak jsem mel program, ktery zas vsechny ty formulare sezbira a ulozi jako text/csv a ten pak kolega naimportoval do oracle databaze pomoci sql prikazu a mozna nejakeho asp programu od jineho kolegu, to uz nevim. Muj ukol byl vymyslet to s temi formulari.
Pisu to, abych te treba inspiraval, ze mozna delas neco zbytecne komplikovane.

Editováno 20.11.2020 16:00
 
Nahoru Odpovědět
20.11.2020 15:58
Avatar
Odpovídá na Peter Mlich
David Mrázek:23.11.2020 8:54

nejspíš se to pokusím vyřešit přes převedení do stringu, děkuju moc za rady!

Nahoru Odpovědět
23.11.2020 8:54
kde je vůle, tam je cesta
Avatar
David Mrázek:23.11.2020 9:23

i když jsem stále ztracený :-@

Nahoru Odpovědět
23.11.2020 9:23
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:23.11.2020 19:39

Ahoj,

if ((ws.Cells[i].ToString() == "Z_KomSilnice_L (24200)/7 "))

skúšal si ToString()?
prípadne skús

ws.Range("A1:B1").Value

kde súradnice nahradíš ako potrebuješ
aktuálne nemám prístup k projektu kde to riešim, skúsim zajtra pozrieť

 
Nahoru Odpovědět
23.11.2020 19:39
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:24.11.2020 9:13

ahoj :-)
ToString() jsem zkoušel a úplně bez výsledku

Nahoru Odpovědět
24.11.2020 9:13
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:24.11.2020 9:19

tak potom použi

ws.Range("A1").Value

súradnice si môžeš vyskladať ako potrebuješ

 
Nahoru Odpovědět
24.11.2020 9:19
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:24.11.2020 11:21

a mohu range nějak skombinovat s načtením jen do prázdné buňky a následně, aby to jelo od začátku další sloupec?

Nahoru Odpovědět
24.11.2020 11:21
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Odpovídá na David Mrázek
Miroslav Holubek:24.11.2020 11:52

Budeš musieť vytvoriť 1 cyklus kde budeš riešiť stĺpec a v ňom druhý čo bude riešiť riadok
Na stĺpec budeš potrebovať procedúru, kde budeš meniť index v cykluse na súradnícu v súbore (0 = A, 1 = B...)

 
Nahoru Odpovědět
24.11.2020 11:52
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:24.11.2020 12:12

Niečo na tento štýl

for (int i = 0; i < 26; i++)        //stlpce v subore, problem nastane po suradnici Z, kde zacinaju znova od AA, tam uz tento kod nebude fungovať
{
    for (int j = 1; j < 100; j++)   //riadky v subore (zaciname od 1, pretoze excel zacina suradnice od 1), pocet zmen podla seba
    {
        int prva = 65 + i;          //priprava prvej suradnice (65 je ASCII kod pismena A)
        string suradnice = ((char)prva).ToString() + j; //dokoncenie suradnice
        //tvoj kod
    }
}
 
Nahoru Odpovědět
24.11.2020 12:12
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:25.11.2020 10:22
using Microsoft.Office.Interop.Excel;
using _Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsApp2
{
    class Class1
    {
        string path = "";
        _Application excel = new _Excel.Application();
        Workbook wb;
        Worksheet ws;
        private object excelWorksheet;

        public Class1(string path, int Sheet)
        {
            this.path = path;
            wb = excel.Workbooks.Open(path);
            ws = (Worksheet)wb.Worksheets[Sheet];
        }
        public string ReadCell(int i, int j)
        {
            for (int i = 0; i < 26; i++)
            {
                for (int j = 1; j < 100; j++)
                {
                    int first = 65 + i;
                    string coordinates = ((char)first).ToString() + j;

                    string cellValue = (string)(excelWorksheet.Cells[i, j] as _Excel.Range).Value;

                    if (cellValue == "Z_KomSilnice_L (24200)/7 ")
                    {
                        return ws.Cells[i, j++];
                    }
                    else
                        return "";
                }
            }
        }
    }
}

dá se to použít takto? fakt jsem totálně zmatený ;-(

Nahoru Odpovědět
25.11.2020 10:22
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Odpovídá na David Mrázek
Miroslav Holubek:25.11.2020 10:28
for (int i = 0; i < 26; i++)
            {
                for (int j = 1; j < 100; j++)
                {
                    int first = 65 + i;
                    string coordinates = ((char)first).ToString() + j;
                   //takto to nejde??
                   if (ws.Range(coordinates).Value == "Z_KomSilnice_L (24200)/7 ")
                    {
                        return ws.Range(coordinates).Value;
                    }
                    else
                        return "";
                }
            }
 
Nahoru Odpovědět
25.11.2020 10:28
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:25.11.2020 10:41

píše mi to errory:
Error CS1955 Non-invocable member '_Worksheet.Ran­ge[object, object]' cannot be used like a method.

Error CS0161 'Class1.ReadCe­ll(int, int)': not all code paths return a value

Error CS0136 A local or parameter named 'i' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter stejně tak i pro "j"

Nahoru Odpovědět
25.11.2020 10:41
kde je vůle, tam je cesta
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:25.11.2020 10:50
public string ReadCell(int i, int j)    //Error CS0136 = int i, int j mas nadeklarovane tu aj v cykle, toto zmen
{
    for (int i = 0; i < 26; i++)
    {
        for (int j = 1; j < 100; j++)
        {
            int first = 65 + i;
            string coordinates = ((char)first).ToString() + j;

            if (ws.Range[coordinates].Value == "Z_KomSilnice_L (24200)/7 ")     //CS1955, moja chyba, pisal som ti to tu z hlavy
            {               //a vacsinou robim vo VB, maju tam byt hranate zatvorky, snad to uz pojde
                return ws.Cells[i, j++];
            }
            else                                 //Error CS0161 bude asi kvoli tej chybe CS1955
                return "";
        }
    }
}

samozrejme, neviem ako mas zvysok kodu, ale tieto 3 problemy by sa mali dat lahko odstranit

Editováno 25.11.2020 10:51
 
Nahoru Odpovědět
25.11.2020 10:50
Avatar
David Mrázek:25.11.2020 10:56

máš pravdu byly to závorky a int, ale CS0161 stále zůstává

Nahoru Odpovědět
25.11.2020 10:56
kde je vůle, tam je cesta
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:25.11.2020 11:14

tak už jsem to rozjel ale žádnou hodnotu mi to nenašlo :-@

Nahoru Odpovědět
25.11.2020 11:14
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:25.11.2020 11:17
if (ws.Range[coordinates].Value == "Z_KomSilnice_L (24200)/7 ")
            {
                return ws.Cells[i, j++];        //preco j inkrementujes? tahas riadok nizsie ako sa pytas, nechces radsej pouzit Range?
            }
            else
                return "";
 
Nahoru Odpovědět
25.11.2020 11:17
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:25.11.2020 12:10

hledám hodnotu vedle ve sloupci

Nahoru Odpovědět
25.11.2020 12:10
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:25.11.2020 13:53

lenže i je stlpec, j ide o riadok nižšie

čiže musíš nanovo vyrobiť súradnice bunky

 
Nahoru Odpovědět
25.11.2020 13:53
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:25.11.2020 14:04

takže já prohodil i takový základ :-S

Nahoru Odpovědět
25.11.2020 14:04
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:25.11.2020 14:55

pohoda, stane sa komukolvek :-)

 
Nahoru Odpovědět
25.11.2020 14:55
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:26.11.2020 9:43

tak jsem to překopal

public string ReadCell(int row, int column)
        {
            column += 1;
            do
            {
                row++;
                if (ws.Cells[row, column].Value == null)
                    break;
                if (ws.Cells[row, column].Value.ToString() == "Z_KomSilnice_L (24200)/7 ")
                {

                    return ws.Cells[row, column + 1].Value2.ToString();
                }
            } while (true);

            return "";

ale nyní je zas problém s řádkem

if (ws.Cells[row, column].Value == null)

píše to chybu: Microsoft.CShar­p.RuntimeBinder­.RuntimeBinde­rException: System.__ComObject' does not contain a definition for 'Value'

Nahoru Odpovědět
26.11.2020 9:43
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Miroslav Holubek:26.11.2020 11:59

Ok, tak poďme od začiatku,

  1. importuj si referenciu Microsoft.Offi­ce.Interop.Ex­cel
  2. pridaj using Microsoft.Offi­ce.Interop.Ex­cel;

3.

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Workbook xlWorkBook;
Worksheet xlWorkSheet;
xlWorkBook = xlApp.Workbooks.Open(path);
xlWorkSheet = xlWorkBook.ActiveSheet;

//mne to funguje bez zavahania, aj ked ja radsej pouzivam xlWorkSheet.Range["A1"].Value
if (xlWorkSheet.Cells[1, 1].Value == null)
       break;
if (xlWorkSheet.Cells[1, 1].Value == "A")
       xlWorkSheet.Cells[1, 1].Value = "B";
 
Nahoru Odpovědět
26.11.2020 11:59
Avatar
Odpovídá na Miroslav Holubek
David Mrázek:26.11.2020 12:25

Začínám přemýšlet jestli nemám něco s excelem

Nahoru Odpovědět
26.11.2020 12:25
kde je vůle, tam je cesta
Avatar
Miroslav Holubek
Supertvůrce
Avatar
Odpovídá na David Mrázek
Miroslav Holubek:26.11.2020 12:26

Skôr bude problém v kóde :-)

 
Nahoru Odpovědět
26.11.2020 12:26
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 25 zpráv z 25.