source

Excel(.XLS 및 .X)을 작성하려면Microsoft Office 를 인스톨 하지 않고, C# 에 LSX) 파일을 인스톨 할 수 있습니까?

manycodes 2023. 2. 7. 00:00
반응형

Excel(.XLS 및 .X)을 작성하려면Microsoft Office 를 인스톨 하지 않고, C# 에 LSX) 파일을 인스톨 할 수 있습니까?

코드를 실행하고 있는 머신에 Excel을 설치하지 않고 C#으로 Excel 스프레드시트를 작성하려면 어떻게 해야 합니까?

ExcelLibrary라는 라이브러리를 사용할 수 있습니다.Google Code에 게시된 무료 오픈 소스 라이브러리입니다.

Excel 라이브러리

이것은 위에서 말한 PHP ExcelWriter의 포트인 것 같습니다.아직 새로운 .xlsx 형식으로 쓰지는 않지만, 그 기능을 에 추가하는 작업을 하고 있습니다.

매우 심플하고, 작고, 사용하기 편리합니다.또한 DataSetHelper를 사용하여 DataSet 및 DataTables를 사용하여 Excel 데이터를 쉽게 작업할 수 있습니다.

ExcelLibrary는 여전히 오래된 Excel 형식(.xls 파일)에서만 사용할 수 있는 것으로 보이지만 향후 새로운 2007/2010 형식에 대한 지원이 추가될 수 있습니다.

또한 Excel 2007/2010 형식 파일(.xlsx 파일)에서만 작동하는 EPPlus를 사용할 수도 있습니다.양쪽을 모두 지원하는 NPOI도 있습니다.

각 라이브러리에는 코멘트에 기재된 몇 가지 알려진 버그가 있습니다.대체로 시간이 지날수록 EPplus가 최선의 선택인 것 같습니다.더 적극적으로 업데이트되고 문서화되어 있는 것 같습니다.

또한 다음 @Publus에서 알 수 있듯이 EPplus는 피벗 테이블을 지원하며 ExcelLibrary에서는 피벗 테이블이 지원될 수 있습니다(ExcelLibrary의 피벗 테이블 문제).

다음은 빠른 참조를 위한 몇 가지 링크입니다.
ExcelLibrary - GNU Lesser GPL
EPplus - GNU (LGPL) - 유지 보수 불필요
EPPlus 5 - Polyform Non-commercial - 2020년 5월 시작
NPOI - Apache 라이선스

다음은 ExcelLibrary의 코드 예시입니다.

다음은 데이터베이스에서 데이터를 가져와 데이터베이스에서 워크북을 작성하는 예입니다.ExcelLibrary 코드는 맨 아래 한 줄입니다.

//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's the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

그만큼 Excel 파일을 쉽게 만들 수 있습니다.엑셀 파일도 수동으로 만들 수 있지만, 위의 기능이 정말 인상적이었습니다.

xlsx 형식이 마음에 드신다면 제 라이브러리인 EPplus를 사용해 보세요.처음에는 Excel Package의 소스로 시작했지만, 이후 완전히 다시 쓰게 되었습니다.

범위, 셀 스타일링, 차트, 모양, 사진, 명명된 범위, AutoFilter 및 기타 많은 기능을 지원합니다.

두 가지 옵션이 있습니다.

  • EPPlus 4 (LGPL 라이선스, 2020년까지 개발)

  • EPplus 5는 Polyform Noncommercial 1.0.0(2020년 이후)에 따라 라이선스되었습니다.

EPplus 5 readme.md 에서 다음 정보를 입수합니다.

새로운 라이선스로 EPplus는 경우에 따라서는 아직 무료로 사용할 수 있지만, 상업적인 비즈니스에서 사용하려면 상용 라이선스가 필요합니다.

EPplus 웹사이트: https://www.epplussoftware.com/

Microsoft Office용 Open XML SDK 2.0을 사용하는 것은 어떻습니까?

몇 가지 이점:

  • Office 설치 불필요
  • Microsoft = 적절한 MSDN 설명서에서 제작
  • 딱 하나.프로젝트에서 사용할 순 dll
  • SDK에는 diff, validator 등 다양한 툴이 부속되어 있습니다.

링크:

저는 다음과 같은 오픈 소스 프로젝트를 성공적으로 사용했습니다.

  • OOXML 포맷용 Excel 패키지 (Office 2007)

  • .X의 NPOILS 형식(Office 2003).NPOI 2.0(베타)은 XLSX도 지원합니다.

제 블로그 투고를 보세요.

Excel 스프레드시트 작성 중.XLS 및 .XC#의 LSX

Excel 테이블 및 동적 차트를 사용한 NPOI

OLEDB를 사용하여 Excel 파일을 만들고 조작할 수 있습니다.확인: OLEDB를 사용한 읽기 및 쓰기 엑셀.

일반적인 예:

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();
}

편집 - 기타 링크:

상용 솔루션인 Spreadsheet Gear for.NET이 합니다.

ASP 라이브를 보실 수 있습니다.NET(C# 및 VB) 샘플은 이쪽에서, 평가판은 이쪽에서 다운로드해 주세요.

면책사항:SpreadsheetGear LLC를 소유하고 있습니다.

HTML 테이블을 사용하는 것이 매우 가벼운 옵션일 수 있습니다.파일에 헤드, 본문 및 테이블 태그를 생성하여 확장자가 .xls인 파일로 저장하기만 하면 됩니다.수식을 포함하여 출력을 스타일링하는 데 사용할 수 있는 Microsoft 고유 속성이 있습니다.

웹 어플리케이션으로 코딩하지 않으실 수도 있지만, 여기 HTML 테이블을 통한 Excel 파일 구성의 가 있습니다.이 기술은 콘솔 앱, 데스크톱 앱 또는 서비스를 코딩할 때 사용할 수 있습니다.

몇 가지 옵션을 사용했습니다.

XLSX가 필수인 경우: Excel Package는 좋은 시작이지만 개발자가 작업을 중단하면서 사라졌습니다.ExML은 거기서 가져와 몇 가지 기능을 추가했습니다.ExML은 나쁘지 않은 옵션입니다.저는 아직 몇 개의 프로덕션 웹사이트에서 사용하고 있습니다.

하지만 새로운 프로젝트에는 모두 NPOI, 즉 를 사용하고 있습니다.Apache POI의 NET 포트. NPOI 2.0(Alpha)도 XLSX를 지원합니다.

Excel 2007/2010 파일을 작성하는 경우는, 다음의 오픈 소스 프로젝트를 사용해 주세요.https://github.com/closedxml/closedxml

XML 문서의 번거로움을 처리하지 않고 파일을 조작할 수 있는 객체 지향적인 방법을 제공합니다(VBA와 유사).모든 사용자가 사용할 수 있습니다.C#이나 Visual Basic(VB)등의 NET 언어.

ClosedXML을 사용하면 Excel 어플리케이션 없이도 Excel 2007/2010 파일을 만들 수 있습니다.일반적인 예는 웹 서버에서 Excel 보고서를 작성하는 것입니다.

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");

C할 수 있는 C#)를수.interop 클래스는 다음과 같습니다.Microsoft.Office.Interop.ExcelOLE가 없다고 했지만(이것이 아님) interop 클래스는 매우 사용하기 쉽습니다.여기서 C#의 메뉴얼을 참조해 주세요(Excel의 Interop은 C#PDF의 1072페이지에서 시작됩니다).

먹어보지 않으셨다면 감명을 받으실 수 있습니다.

이에 대한 Microsoft의 입장에 유의하시기 바랍니다.

Microsoft는 현재 무인 비인터랙티브 클라이언트 애플리케이션 또는 컴포넌트(ASP, ASP 포함)로부터의 Microsoft Office 애플리케이션 자동화를 권장하지 않으며 지원하지 않습니다.NET, DCOM 및 NT 서비스)를 사용하는 경우 Office가 이 환경에서 실행되면 동작이 불안정해지거나 교착 상태가 될 수 있습니다.

ExcelXmlWriter 를 사용할 수 있습니다.

잘 되고 있어요.

여기 무료 라이브러리가 #에서 수 .이 라이브러리를 사용하면DataSet,DataTable ★★★★★★★★★★★★★★★★★」List<>OpenXML Excel 2007 .xlsx 。

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

설명서와 함께 전체 소스 코드가 무료로 제공됩니다.

이 클래스를 응용 프로그램에 추가한 후 DataSet을 Excel로 한 줄의 코드만으로 내보낼 수 있습니다.

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

그렇게 간단하지 않아...

또한 Excel을 서버에 설치할 필요도 없습니다.

XML 스프레드시트 2003 형식을 사용하여 파일을 만드는 것을 고려해 볼 수 있습니다.이는 문서화된 스키마를 사용한 단순한 XML 형식입니다.

당신은 GemBox를 보는 것이 좋을지도 모른다.스프레드시트

모든 기능을 갖춘 무료 버전이 있지만, 필요에 따라 1장당 150줄, 워크북당 5장으로 제한됩니다.

아직 직접 쓸 필요는 없지만 재미있을 것 같아요.

Syncfusion Essential XlsIO는 이 작업을 수행할 수 있습니다.Microsoft 오피스에 의존하지 않고, 플랫폼 마다 특정의 서포트도 있습니다.

코드 샘플:

//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);

자격이 있는 경우 커뮤니티 라이센스 프로그램을 통해 모든 제어 기능을 무료로 이용할 수 있습니다(매출액 100만 달러 미만).주의: Syncfusion에서 일하고 있습니다.

다양한 Office 2003 XML 라이브러리는 작은 Excel 파일에서도 사용할 수 있습니다.다만, XML 형식으로 보존되어 있는 큰 워크북의 사이즈가 문제가 되고 있습니다.예를 들어 워크북이 40MB인 새로운 XLSX 형식(더 촘촘히 채워진 형식)은 360MB XML 파일이 됩니다.

제가 조사한 바로는 오래된 바이너리 파일 형식으로 출력할 수 있는 상용 패키지가 두 개 있습니다.다음과 같은 것이 있습니다.

둘 다 싸지 않다(각각 500달러, 800달러).둘 다 Excel 자체와는 독립적으로 작동합니다.

궁금한 것은 OpenOffice.org 등의 Excel 출력 모듈입니다.자바에서 포팅이 가능한지 궁금합니다.그물.

System을 이용하여 Excel 객체를 사용하지 않고 데이터셋을 Excel로 내보내기 위한 간단한 코드를 작성하였습니다.IO.StreamWriter.

아래는 데이터 집합에서 모든 테이블을 읽고 하나씩 시트에 쓰는 코드입니다.는 이 기사에서 도움을 받았다.

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();
    }

OpenXML은 MS Excel을 서버에 설치하지 않아도 되는 좋은 대안입니다.Microsoft가 제공하는 Open XML SDK 2.0은 Open XML 패키지와 패키지 내의 기본 Open XML 스키마 요소를 조작하는 작업을 단순화합니다.Open XML Application Programming Interface(API)는 개발자가 Open XML 패키지에서 수행하는 많은 일반적인 작업을 캡슐화합니다.

OpenXML: 서버에 MS Excel을 설치하지 않도록 하는 대체 방법을 확인하십시오.

최근에 FlexCel을 사용했습니다.NET에서 훌륭한 라이브러리임을 알게 되었습니다!나는 너무 많은 소프트웨어 제품에 대해 그렇게 말하지 않는다.여기서 전체 판매 정보를 제공하는 것은 의미가 없습니다. 웹사이트에서 모든 기능을 읽을 수 있습니다.

시판 제품이지만 구입하시면 풀 소스를 받으실 수 있습니다.그러니까 원한다면 조립체로 만들 수 있을 것 같네요그렇지 않으면 xcopy를 위한 추가 어셈블리 1개만 있으면 됩니다.구성이나 설치 같은 것은 필요 없습니다.

서드파티 라이브러리가 없으면 이 작업을 수행할 수 없습니다.물론 NET 프레임워크는 이를 지원하지 않으며 OLE Automation은 매우 어려운 과제입니다.

음.

Aspose와 같은 서드파티 라이브러리를 사용할 수도 있습니다.

이 라이브러리는 Excel을 컴퓨터에 설치할 필요가 없다는 장점이 있으며, 이는 고객의 경우에 이상적입니다.

XML 스프레드시트 생성에 동의합니다.C# 3(모두 VB 9:P에서 블로그에 올리기만 하면 됨)의 작성 방법에 대한 예를 다음에 제시하겠습니다.http://www.aaron-powell.com/linq-to-xml-to-excel

고객님의 문제를 직접 해결하는 서드파티 솔루션에 대한 참조를 하나 더 추가하고 싶습니다.http://www.officewriter.com

(면책자:OfficeWriter를 만드는 SoftArtisans에서 일하고 있습니다.)

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);
            }
        }
    }
}

안녕하세요, 이 솔루션은 그리드 뷰를 Excel 파일로 내보내는 것으로 도움이 될 수 있습니다.

Infragistics나 Syncfusion과 같은 일부 서드파티 컴포넌트 벤더는 Microsoft Excel을 설치할 필요가 없는 매우 우수한 Excel 내보내기 기능을 제공합니다.

이러한 벤더는 고도의 UI 그리드 컴포넌트도 제공하므로 Excel 내보내기 스타일과 레이아웃이 어플리케이션의 사용자 인터페이스에서 그리드의 현재 상태를 모방하는 경우에 특히 편리합니다.

내보내기 데이터가 강조되고 UI 링크가 없는 서버 측에서 내보내기를 의도하는 경우 무료 오픈 소스 옵션(ExcelLibrary 등) 중 하나를 선택합니다.

이전에 Microsoft Office 스위트에서 서버 사이드 오토메이션의 사용을 시도한 프로젝트에 관여한 적이 있습니다.이 경험을 바탕으로 저는 그 접근법에 반대할 것을 강력히 권합니다.

IKVM + POI

또는 Interop을 사용할 수 있습니다.

다음은 LINQ to XML을 사용하여 수행하는 방법이며, 샘플 코드를 모두 포함합니다.

LINQ를 사용하여 Excel 데이터를 XML로 빠르게 Import 및 내보내기

네임스페이스 등을 Import 할 필요가 있기 때문에 조금 복잡하지만 외부 의존관계를 회피할 수 있습니다.

(물론 VB입니다).NET, C#은 아니지만 VB는 언제든지 분리할 수 있습니다.XML Literal을 사용하고, 그 외의 모든 것을 C#에서 실시하기 위해서, 자체 프로젝트의 NET 스탭을 사용합니다).

다음 라이브러리를 사용하여 올바르게 포맷된 Excel 파일을 만들 수 있습니다.http://officehelper.codeplex.com/documentation
"이것들"은 다음과 같습니다.

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");
}        

여기서 샘플은 다음과 같습니다.

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};
    }
}

C#에서 Excel 파일을 작성하는 가장 간단하고 빠른 방법은 Open XML Productivity Tool을 사용하는 것입니다.Open XML Productivity Tool은 Open XML SDK 설치와 함께 제공됩니다.툴은 모든 Excel 파일을 C# 코드로 리버스 엔지니어링합니다.그런 다음 C# 코드를 사용하여 해당 파일을 다시 생성할 수 있습니다.

관련된 프로세스의 개요는 다음과 같습니다.

  1. 도구를 사용하여 Open XML SDK를 설치합니다.
  2. 원하는 모양을 가진 최신 Excel 클라이언트를 사용하여 Excel 파일을 만듭니다.을 대라!DesiredLook.xlsx.
  3. 를 연 에서 ★★★★★★★★★★★★★★★★★★★★★★★★★★★」DesiredLook.xlsx상단의 [Reflect Code]버튼을 클릭합니다.여기에 이미지 설명 입력
  4. 파일의 C# 코드가 툴의 오른쪽 페인에 생성됩니다.이를 C# 솔루션에 추가하여 원하는 형태로 파일을 생성합니다.

또한 이 방법은 모든 Word 및 PowerPoint 파일에 사용할 수 있습니다.그런 다음 C# 개발자는 필요에 따라 코드를 변경합니다.

저는 이 목적을 위해 Windows에서 실행되는 간단한 WPF 앱을 github에서 개발했습니다.라는 플레이스홀더 클래스가 있습니다.GeneratedClass생성된 코드를 붙여넣을 수 있습니다.파일의 한 버전을 되돌리면 다음과 같은 Excel 파일이 생성됩니다.

여기에 이미지 설명 입력

Java 오픈 소스 솔루션은 Apache POI입니다.여기서 interop을 셋업할 수 있는 방법이 있을지도 모릅니다만, 저는 Java에 대해서는 잘 모릅니다.

이 문제를 조사했을 때는 Interop 어셈블리를 사용하게 되었습니다.

sylk를 먹어본 적 있어?

예전에는 sylk로 classic asp로 엑셀시트를 생성했었는데 지금은 엑셀 제너레이터도 찾고 있습니다.

sylk의 장점은 셀 형식을 지정할 수 있다는 것입니다.

언급URL : https://stackoverflow.com/questions/151005/how-do-i-create-an-excel-xls-and-xlsx-file-in-c-sharp-without-installing-mic

반응형