Kaip sukurti „Excel“ failą (.XLS ir .XLSX) „С #“ be diegimo „MS Office“?

Kaip sukurti „Excel“ skaičiuoklę naudojant „C #“, nereikalaujant „Excel“ diegimo kompiuteryje su kodu?

1667 m
30 сент. nustatė mistrmark 30 sep . 2008-09-30 01:30 '08, 1:30, 2008-09-30 01:30
@ 42 atsakymai
  • 1
  • 2

Galite naudoti biblioteką, pavadintą „ExcelLibrary“. Tai nemokama atviro kodo biblioteka, talpinama „Google“ kode:

„ExcelLibrary“

Atrodo, kad pirmiau minėtas „PHP ExcelWriter“ prievadas. Jis dar nepasirašys į naują .xlsx formatą, tačiau jie prideda šią funkciją.

Tai labai paprasta, maža ir paprasta naudoti. Be to, jame yra „DataSetHelper“, kuri leidžia naudoti „DataSets“ ir „DataTables“, kad galėtumėte lengvai dirbti su „Excel“ duomenimis.

Atrodo, kad „ExcelLibrary“ vis dar veikia tik seniems „Excel“ formatams (.xls failams), tačiau ateityje ji gali pridėti paramą naujiems 2007/2010 formatams.

Taip pat galite naudoti EPPlus , kuris veikia tik „Excel 2007/2010“ failams (.xlsx failams). Taip pat yra NPOI, kuris dirba su abiem.

Kiekvienoje bibliotekoje yra keletas žinomų klaidų, kaip pažymėta komentaruose. Apskritai, atrodo, kad EPPlus yra geriausias pasirinkimas. Atrodo, kad ji taip pat yra aktyviau atnaujinama ir dokumentuojama.

Be to, kaip pažymėjo toliau Artem Tsarionov, EPPlus palaiko „pivot“ lenteles, o „ExcelLibrary“ gali turėti tam tikrą paramą („ ExcelLibrary“ lentelės „Pivot“ problema )

Toliau pateikiamos kelios nuorodos, skirtos greitai nurodyti:
„ExcelLibrary“ - „ GNU Lesser GPL“
EPPlus - GNU mažesnė bendroji viešoji licencija (LGPL)
NKOI - Apache licencija

Čia yra ExcelLibrary pavyzdys:

Štai pavyzdys, kaip gauti duomenis iš duomenų bazės ir sukurti darbo knygą. Atkreipkite dėmesį, kad ExcelLibrary kodas yra viena eilutė žemiau:

 //Create the data set and table DataSet ds = new DataSet("New_DataSet"); DataTable dt = new DataTable("New_DataTable"); //Set the locale for each ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; //Open a DB connection (in this example with OleDB) OleDbConnection con = new OleDbConnection(dbConnectionString); con.Open(); //Create a query and fill the data table with the data from the DB string sql = "SELECT Whatever FROM MyDBTable;"; OleDbCommand cmd = new OleDbCommand(sql, con); OleDbDataAdapter adptr = new OleDbDataAdapter(); adptr.SelectCommand = cmd; adptr.Fill(dt); con.Close(); //Add the table to the data set ds.Tables.Add(dt); //Here the easy part. Create the Excel worksheet from the data set ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds); 

Sukurti „Excel“ failą yra taip paprasta. Taip pat galite rankiniu būdu sukurti „Excel“ failus, bet pirmiau išvardytos funkcijos mane nustebino.

930
09 апр. Atsakymas, kurį pateikė Mike Webb, balandžio 09 d 2010-04-09 00:36 '10 ne 0:36 2010-04-09 00:36

Jei esate patenkintas „xlsx“ formatu, pabandykite naudoti „ codeplex GitHub“ projektą. EPPlus . Aš ją pradėjau iš šaltinio iš „ExcelPackage“, bet šiandien jis perrašomas. Palaiko diapazonus, ląstelių stilius, diagramas, figūras, paveikslėlius, vardų pavadinimus, automatinį filtrą ir daugelį kitų dalykų.

border=0
523
29 марта '10 в 15:25 2010-03-29 15:25 atsakė Jan Källman'ui kovo 10 d. 15:25 2010-03-29 15:25

Sėkmingai naudoju šiuos atviro kodo projektus:

  • „ExcelPackage“ OOXML formatams („Office 2007“)

  • NPOI už .xls formatą (Office 2003). NPOI 2.0 (Alpha) taip pat palaiko XLSX.

Peržiūrėkite mano dienoraščio įrašus:

„Excel“ skaičiuoklių kūrimas XLS ir XLSX C #

NPOI su Excel skaičiuokle ir dinamine diagrama

156
20 июня '09 в 23:48 2009-06-20 23:48 atsakymą pateikė Leniel Maccaferri birželio 20 d. , 09:48, 2009-06-20 23:48

Kaip apie atvirą XML SDK 2.0 naudojimą „Microsoft Office“?

Keli privalumai:

  • Nereikalaujama Office diegimo
  • Pagaminta „Microsoft“ = vertas MSDN dokumentas
  • Tik vienas .Net dll, skirtas naudoti projekte
  • SDK yra su daugybe įrankių, pvz., „Diff“, „validator“ ir tt

Nuorodos:

152
16 авг. Atsakymas pateikiamas Pellared 16 rug . 2011-08-16 12:25 '11, 12:25, 2011-08-16 12:25

Naudodami „OLEDB“ galite kurti ir apdoroti „Excel“ failus. Check it out: skaitykite ir rašykite „Excel“ naudojant „OLEDB“ .

Tipiškas pavyzdys:

 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'")) { conn.Open(); OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn); cmd.ExecuteNonQuery(); } 

Redaguoti - dar keletas nuorodų:

99
30 сент. Atsakymas pateikiamas Panos 30 rugsėjo. 2008-09-30 01:41 '08, 1:41 am. 2008-09-30 01:41

Tai bus komercinis sprendimas, „ SpreadsheetGear for .NET“ .

Čia galite pamatyti ASP.NET gyvus mėginius (C # ir VB) ir atsisiųsti bandomąją versiją čia .

Atsakomybės apribojimas: Aš turiu „SpreadsheetGear LLC“

76
24 янв. Atsakymą pateikė Joe Erickson Jan 24 2009-01-24 21:33 '09 21:33 2009-01-24 21:33

Keletas pasirinktų parinkčių:

Jei XLSX yra privaloma: „ ExcelPackage“ yra geras pradžia, bet jis mirė, kai kūrėjas nustojo veikti. ExML iš ten išaugo ir pridėjo keletą funkcijų. „ExML“ nėra blogas variantas, vis dar jį naudojasi keliose svetainėse.

Tačiau visuose naujuose projektuose naudoju NPOI , .NET Apache POI uostą. NPOI 2.0 (Alpha) taip pat palaiko XLSX.

61
01 июня '09 в 18:45 2009-06-01 18:45 atsakymas duotas „ Nate“ birželio 1 d., 09, 18:45 2009-06-01 18:45

Labai lengvas variantas gali būti HTML lentelių naudojimas. Tiesiog sukurkite failo galvos, kūno ir stalo žymes ir išsaugokite jį kaip failą su .xls plėtiniu. Yra specialių „Microsoft“ atributų, kuriuos galite naudoti norint sukurti išvestį, įskaitant formulę.

Suprantu, kad negalite koduoti šios žiniatinklio programos, bet čia yra Excel failo sudėties per HTML lentelę pavyzdys . Šis metodas gali būti naudojamas, jei kodavote konsolės programą, darbalaukio programą arba paslaugą.

58
30 сент. Atsakymą pateikė „ Forgotten Semicolon“ rugsėjo 30 d. 2008-09-30 01:37 '08, 1:37 am. 2008-09-30 01:37

Galite naudoti „ ExcelXmlWriter“ .

Jis veikia gerai.

45
12 февр. atsakymą pateikė Petr Snobelt , vasario 12 d. 2009-02-12 18:04 '09, 18:04 2009-02-12 18:04

Jūs tikrai galite patikrinti sąveikos klases . Jūs nesakote OLE (tai nėra), tačiau sąveikos klasės yra labai paprasta naudoti.

Jums gali būti įspūdis, jei jų nebandėte.

Atkreipkite dėmesį į „Microsoft“ poziciją šiuo klausimu:

„Microsoft“ šiuo metu nerekomenduoja ar nepalaiko „Microsoft Office“ programų automatizavimo iš bet kokio neaktyvumo, neinteraktyviosios kliento programos ar komponento (įskaitant ASP, ASP.NET, DCOM ir NT paslaugas), nes „Office“ gali rodyti nestabilų elgesį ir (arba) aklavietę. šioje aplinkoje.

42
30 сент. atsakymas pateikiamas GEOCHET 30 sep . 2008-09-30 01:34 '08 1:34 am. 2008-09-30 01:34

Jei kuriate „Excel 2007/2010“ failus, pabandykite šį atviro kodo projektą: https://github.com/closedxml/closedxml

Jis suteikia į objektą orientuotą būdą manipuliuoti failais (panašiais į VBA), neapsiribojant XML dokumentų problemomis. Jis gali būti naudojamas bet kurioje .NET kalba, pvz., C # ir Visual Basic (VB).

ClosedXML leidžia jums sukurti „Excel 2007/2010“ failus be „Excel“. Tipiškas pavyzdys yra „Excel“ ataskaitų kūrimas žiniatinklio serveryje:

 var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sample Sheet"); worksheet.Cell("A1").Value = "Hello World!"; workbook.SaveAs("HelloWorld.xlsx"); 
41
23 нояб. atsakymą pateikė lapkričio 23 d. 2010-11-23 19:33 '10, 19:33, 2010-11-23 19:33

Čia yra visiškai nemokama „C #“ biblioteka, kuri leidžia eksportuoti iš „ DataSet , „ DataTable arba List<> į originalią „Excel.xlsx Excel 2007“ failą.

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

Visas pradinis kodas pateikiamas nemokamai - kartu su instrukcijomis ir demo programa.

Pridėję šią klasę prie programos, galite eksportuoti „DataSet“ į „Excel“ tik su viena kodu:

 CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx"); 

Tai nėra daug lengviau nei šis ...

Ir tai net nereikalauja „Excel“ jūsų serveryje.

30
05 дек. Atsakymas, kurį pateikė Mike Gledhill 05 gruodis 2011-12-05 15:08 '11 at 15:08 2011-12-05 15:08

Galite pagalvoti apie savo failų kūrimą naudojant „XML Spreadsheet 2003“ formatą . Tai paprastas XML formatas, naudojant gerai dokumentuotą schemą .

23
30 сент. Atsakymą pateikė Sam Warwick, rugsėjo 30 d 2008-09-30 04:16 '08 4:16 am. 2008-09-30 04:16

„Syncfusion Essential XlsIO“ gali tai padaryti. Jis nepriklauso nuo „Microsoft“ biuro ir taip pat palaiko įvairias platformas.

Kodo pavyzdys:

 //Creates a new instance for ExcelEngine. ExcelEngine excelEngine = new ExcelEngine(); //Loads or open an existing workbook through Open method of IWorkbooks IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName); //To-Do some manipulation| //To-Do some manipulation //Set the version of the workbook. workbook.Version = ExcelVersion.Excel2013; //Save the workbook in file system as xlsx format workbook.SaveAs(outputFileName); 

Visas valdymo priemonių rinkinys yra nemokamas, naudojant bendruomenės licencijavimo programą, jei turite teisę gauti pajamas (mažiau nei 1 mln. JAV dolerių). Pastaba Dirbu sinchronizuojant.

19
07 окт. Atsakyti Danis Jebaraj 07 spalis 2016-10-07 21:03 '16 at 21:03 2016-10-07 21:03

Galite pažvelgti į „ GemBox.Spreadsheet“ .

Jie turi nemokamą versiją su visomis funkcijomis, tačiau jis ribojamas iki 150 eilučių už lapą ir 5 lapai knygoje, jei tai atitinka jūsų poreikius.

Aš vis dar neturėjau jo naudoti, bet įdomu.

17
30 сент. Atsakymas pateikiamas ManiacZX 30 rugsėjis. 2008-09-30 01:48 '08 ne 1:48 2008-09-30 01:48

Na,

Taip pat galite naudoti trečiosios šalies biblioteką, pvz., Aspose .

Ši biblioteka turi pranašumą, kad „Excel“ nebus įdiegta jūsų kompiuteryje, kuri būtų ideali jūsų atveju.

14
10 нояб. Atsakymą pateikė Dimi Takis lapkričio 10 d 2009-11-10 08:05 '09, 08:05 am 2009-11-10 08:05

„OpenXML“ taip pat yra gera alternatyva, kuri padeda išvengti „MS Excel“ diegimo serveryje. „Microsoft“ atvirojo XML SDK 2.0 supaprastina atvirų XML paketų ir pagrindinio „Open XML“ schemos elementų tvarkymo užduotį. Atidaryti XML taikomųjų programų programavimo sąsaja (API) apima daug bendrų užduočių, kurias kūrėjai atlieka „Open XML“ paketuose.

Pažymėkite OpenXML: Alternatyva, kuri padeda išvengti MS Excel diegimo serveryje

14
02 дек. Atsakymą pateikė Sachin Dhir, gruodžio 2 d. 2015-12-02 16:30 '15 - 16.30 val. 2015-12-02 16:30

Tiesiog norite pridėti dar vieną nuorodą į trečiosios šalies sprendimą, kuris tiesiogiai išsprendžia jūsų problemą: http://www.officewriter.com

(Atsakomybės apribojimas: dirbau „SoftArtisans“, kompanijoje, kuri gamina „OfficeWriter“)

13
23 авг. atsakymą pateikė Eisbaer 23 rug . 2011-08-23 19:52 '11, 19:52, 2011-08-23 19:52

Įvairios „Office 2003“ bibliotekų bibliotekos yra prieinamos mažiems Excel failams. Tačiau manau, kad didelės XML formato knygos dydis yra problema. Pavyzdžiui, darbo knygoje, su kuria dirbau, bus 40 MB nauju (ir, žinoma, labiau supakuotu) XLSX formatu, jis taps 360 MB failu.

Kalbant apie savo tyrimus, turiu du komercinius paketus, kurie leidžia rodyti senus dvejetainius failų formatus. Jie yra:

Ne pigiai (500USD ir 800USD atitinkamai, manau). tačiau abi veikia nepriklausomai nuo „Excel“.

Man įdomu, kad „Excel“ išėjimo modulis skirtas „OpenOffice.org“. Įdomu, ar galite juos perkelti iš „Java“ į .Net.

13
24 нояб. atsakymas pateikiamas biozinkui 24 nov. 2008-11-24 11:22 '08 at 11:22 2008-11-24 11:22

Sutinku su XML lentelių kūrimu, čia yra pavyzdys, kaip tai padaryti C # 3 (visi tiesioginiai dienoraščiai apie tai VB 9: P) http://www.aaron-powell.com/linq-to-xml-to -excel

13
30 сент. Aaron Powell atsakymas rugsėjo 30 d 2008-09-30 06:53 '08, 6:53 am. 2008-09-30 06:53

IKVM + LV

Arba galite naudoti Interop ...

11
30 сент. Atsakymą pateikė MagicKat 30 rugsėjis 2008-09-30 01:39 '08, 1:39 2008-09-30 01:39

Kai kurie trečiosios šalies komponentų tiekėjai, pvz., „Infragistics“ arba „Syncfusion“, suteikia labai geras „Excel“ eksporto galimybes, kurioms nereikia „Microsoft Excel“ diegimo.

Kadangi šie paslaugų teikėjai taip pat teikia pažangias UI tinklo dalis, šie komponentai yra ypač naudingi, jei norite, kad „Excel“ stilius ir išdėstymas imituotų dabartinę tinklo akių būseną jūsų programos vartotojo sąsajoje.

Jei jūsų eksportas yra skirtas atlikti serverio pusėje, daugiausia dėmesio skiriant eksportuojamiems duomenims, ir nenurodant vartotojo sąsajos, norėčiau naudoti vieną iš nemokamų atvirojo kodo parinkčių (pavyzdžiui, „ExcelLibrary“).

Aš anksčiau dalyvavau projektuose, kurie bandė naudoti serverio automatizavimą „Microsoft Office“. Remdamiesi šia patirtimi, aš primygtinai rekomenduotume nepritarti tokiam požiūriui.

11
16 февр. Atsakymas pateikiamas Simen S 16 vasario mėn. 2011-02-16 14:47 '11 at 14:47 2011-02-16 14:47

Neseniai naudoju FlexCel.NET ir radau puikią biblioteką! Aš nekalbu apie per daug programinės įrangos produktų. Čia nebūtina nurodyti visos pardavimų apimties, galite perskaityti visas savo svetainės funkcijas.

Tai yra komercinis produktas, bet jūs gaunate pilną šaltinį, jei jį įsigysite. Todėl, manau, jūs galėtumėte kompiliuoti ją į savo statybą, jei norite. Priešingu atveju, tai yra tik vienas papildomas „xcopy“ kūrimas - jokia konfigūracija ar diegimas ar nieko panašaus.

Nemanau, kad jūs negalėsite tai padaryti be trečiųjų šalių bibliotekų, nes .NET sistema akivaizdžiai nepalaiko jo ir OLE automatizavimas yra tik visas skausmo pasaulis.

11
15 февр. Atsakymas duotas EMP 15 Feb. 2009-02-15 11:12 '09 11:12 2009-02-15 11:12
 public class GridViewExportUtil { public static void Export(string fileName, GridView gv) { HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader( "content-disposition", string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) { // Create a form to contain the grid Table table = new Table(); // add the header row to the table if (gv.HeaderRow != null) { GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); table.Rows.Add(gv.HeaderRow); } // add each of the data rows to the table foreach (GridViewRow row in gv.Rows) { GridViewExportUtil.PrepareControlForExport(row); table.Rows.Add(row); } // add the footer row to the table if (gv.FooterRow != null) { GridViewExportUtil.PrepareControlForExport(gv.FooterRow); table.Rows.Add(gv.FooterRow); } // render the table into the htmlwriter table.RenderControl(htw); // render the htmlwriter into the response HttpContext.Current.Response.Write(sw.ToString()); HttpContext.Current.Response.End(); } } } /// <summary> /// Replace any of the contained controls with literals /// </summary> /// <param name="control"></param> private static void PrepareControlForExport(Control control) { for (int i = 0; i < control.Controls.Count; i++) { Control current = control.Controls[i]; if (current is LinkButton) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text)); } else if (current is ImageButton) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText)); } else if (current is HyperLink) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text)); } else if (current is DropDownList) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text)); } else if (current is CheckBox) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False")); } if (current.HasControls()) { GridViewExportUtil.PrepareControlForExport(current); } } } } 

Sveiki, sprendimas yra eksportuoti tinklelio vaizdą į jūsų Excel failą, kuris gali jums padėti

11
28 апр. atsakymas, kurį pateikė Gaurav, balandžio 28 d 2011-04-28 13:40 '11, 13:40, 2011-04-28 13:40

Su šia biblioteka galite sukurti gražiai suformatuotus „Excel“ failus: http://officehelper.codeplex.com/documentation
Toliau pateiktas pavyzdys:

 using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME)) { helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN; helper.CurrentSheetName = "Sheet1"; helper.CurrentPosition = new CellRef("C3"); //the template xlsx should contains the named range "header"; use the command "insert"/"name". helper.InsertRange("header"); //the template xlsx should contains the named range "sample1"; //inside this range you should have cells with these values: //<name> , <value> and <comment>, which will be replaced by the values from the getSample() CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"}); helper.InsertRange(sample1, getSample()); //you could use here other named ranges to insert new cells and call InsertRange as many times you want, //it will be copied one after another; //even you can change direction or the current cell/sheet before you insert //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it helper.DeleteSheet("Sheet3"); } 

kai mėginys yra toks:

 private IEnumerable<List<object>> getSample() { var random = new Random(); for (int loop = 0; loop < 3000; loop++) { yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop}; } } 
11
03 дек. atsakymas, kurį pateikė user529824 03 Dec. 2010-12-03 22:53 '10, 10:53 val. 2010-12-03 22:53

Čia galite tai padaryti su LINQ į XML, užpildytą su pavyzdiniu kodu:

Greitas „Excel“ duomenų importavimas ir eksportas naudojant LINQ į XML

Tai šiek tiek sudėtinga, nes jums reikia importuoti vardų sritis ir tt, tačiau tai leidžia išvengti bet kokių išorinių priklausomybių.

(Be to, tai, žinoma, tai yra VB.NET, o ne C #, bet visada galite atskirti VB.NET medžiagą savo projekte, kad galėtumėte naudoti XML literatūrą ir padaryti viską, kas daroma C #.)

11
30 сент. Ryan Lundy atsakymas rugsėjo 30 d 2008-09-30 04:39 '08 at 4:39 2008-09-30 04:39

Keletas naudingų „C“ automatizavimo automatų galima rasti šioje nuorodoje.

http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm

Boltonas.

9
10 нояб. atsakymą pateikė vartotojo35711 lapkritis 10 2009-11-10 08:02 '09 8:02 am 2009-11-10 08:02

Aš parašiau paprastą kodą, kad galėčiau eksportuoti Excel rinkinį, nenaudojant Excel objekto naudojant System.IO.StreamWriter.

Žemiau pateikiamas kodas, kuris skaitys visas duomenų rinkinio lenteles ir po vieną parašys jas į lapus. Aš gavau pagalbą iš šio straipsnio .

 public static void exportToExcel(DataSet source, string fileName) { const string endExcelXML = "</Workbook>"; const string startExcelXML = "<xml version>\r\n<Workbook " + "xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" + " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " + "xmlns:x=\"urn:schemas- microsoft-com:office:" + "excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" + "office:spreadsheet\">\r\n <Styles>\r\n " + "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " + "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" + "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" + "\r\n <Protection/>\r\n </Style>\r\n " + "<Style ss:ID=\"BoldColumn\">\r\n <Font " + "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " + "<Style ss:ID=\"StringLiteral\">\r\n <NumberFormat" + " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " + "ss:ID=\"Decimal\">\r\n <NumberFormat " + "ss:Format=\"0.0000\"/>\r\n </Style>\r\n " + "<Style ss:ID=\"Integer\">\r\n <NumberFormat " + "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " + "ss:ID=\"DateLiteral\">\r\n <NumberFormat " + "ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " + "</Styles>\r\n "; System.IO.StreamWriter excelDoc = null; excelDoc = new System.IO.StreamWriter(fileName); int sheetCount = 1; excelDoc.Write(startExcelXML); foreach (DataTable table in source.Tables) { int rowCount = 0; excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">"); excelDoc.Write("<Table>"); excelDoc.Write("<Row>"); for (int x = 0; x < table.Columns.Count; x++) { excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">"); excelDoc.Write(table.Columns[x].ColumnName); excelDoc.Write("</Data></Cell>"); } excelDoc.Write("</Row>"); foreach (DataRow x in table.Rows) { rowCount++; //if the number of rows is > 64000 create a new page to continue output if (rowCount == 64000) { rowCount = 0; sheetCount++; excelDoc.Write("</Table>"); excelDoc.Write(" </Worksheet>"); excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">"); excelDoc.Write("<Table>"); } excelDoc.Write("<Row>"); //ID=" + rowCount + " for (int y = 0; y < table.Columns.Count; y++) { System.Type rowType; rowType = x[y].GetType(); switch (rowType.ToString()) { case "System.String": string XMLstring = x[y].ToString(); XMLstring = XMLstring.Trim(); XMLstring = XMLstring.Replace(" " XMLstring = XMLstring.Replace(">", ">"); XMLstring = XMLstring.Replace("<", "<"); excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" + "<Data ss:Type=\"String\">"); excelDoc.Write(XMLstring); excelDoc.Write("</Data></Cell>"); break; case "System.DateTime": //Excel has a specific Date Format of YYYY-MM-DD followed by //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000 //The Following Code puts the date stored in XMLDate //to the format above DateTime XMLDate = (DateTime)x[y]; string XMLDatetoString = ""; //Excel Converted Date XMLDatetoString = XMLDate.Year.ToString() + "-" + (XMLDate.Month < 10 ? "0" + XMLDate.Month.ToString() : XMLDate.Month.ToString()) + "-" + (XMLDate.Day < 10 ? "0" + XMLDate.Day.ToString() : XMLDate.Day.ToString()) + "T" + (XMLDate.Hour < 10 ? "0" + XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) + ":" + (XMLDate.Minute < 10 ? "0" + XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) + ":" + (XMLDate.Second < 10 ? "0" + XMLDate.Second.ToString() : XMLDate.Second.ToString()) + ".000"; excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" + "<Data ss:Type=\"DateTime\">"); excelDoc.Write(XMLDatetoString); excelDoc.Write("</Data></Cell>"); break; case "System.Boolean": excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" + "<Data ss:Type=\"String\">"); excelDoc.Write(x[y].ToString()); excelDoc.Write("</Data></Cell>"); break; case "System.Int16": case "System.Int32": case "System.Int64": case "System.Byte": excelDoc.Write("<Cell ss:StyleID=\"Integer\">" + "<Data ss:Type=\"Number\">"); excelDoc.Write(x[y].ToString()); excelDoc.Write("</Data></Cell>"); break; case "System.Decimal": case "System.Double": excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" + "<Data ss:Type=\"Number\">"); excelDoc.Write(x[y].ToString()); excelDoc.Write("</Data></Cell>"); break; case "System.DBNull": excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" + "<Data ss:Type=\"String\">"); excelDoc.Write(""); excelDoc.Write("</Data></Cell>"); break; default: throw (new Exception(rowType.ToString() + " not handled.")); } } excelDoc.Write("</Row>"); } excelDoc.Write("</Table>"); excelDoc.Write(" </Worksheet>"); sheetCount++; } excelDoc.Write(endExcelXML); excelDoc.Close(); } 
9
ответ дан Harsha.Vaswani 23 июля '15 в 10:55 2015-07-23 10:55