在不使用任何第三方dll / interop / sdk的情况下在C#2.0中编写excel文件

时间:2013-08-23 23:11:13

标签: asp.net .net excel dll c#-2.0

我想在C#中编写一个excel文件(xls / xlsx)。

约束:
写作时我不想使用以下内容:
1.第三方DLL(我的客户不允许我使用第三方dll)
2. SDK(与上述原因相同,不允许下载)
3.不允许在目标服务器中使用互操作,没有安装办公室 4. OpenXml

的信息:
1.使用VS 2005.
2.使用ASP.Net(C#2.0)

4 个答案:

答案 0 :(得分:3)

编写一个可以直接用Excel打开的csv文件。

答案 1 :(得分:3)

我认为这会对你有帮助

    [DllImport("user32.dll")]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    public DataTable readexcelV1(string path, bool isHeader, params string[] sheetname)
    {

        bool isFirstTime = true;
        string filePath = path;
        Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
        ExcelApp.Visible = false;
        Microsoft.Office.Interop.Excel.Workbook wb = ExcelApp.Workbooks.Open(filePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

        string ActiveSheetName = "";
        if (sheetname.Count() == 0)
            ActiveSheetName = ((dynamic)wb).ActiveSheet.Name;
        else
            ActiveSheetName = Convert.ToString(sheetname[0]);

        Microsoft.Office.Interop.Excel.Worksheet sh = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets[ActiveSheetName];
        //////////////////////////
        excellt.Range excelRange = sh.UsedRange;
        Int32 Userows = excelRange.Rows.Count;
        Int32 Usecolumns = excelRange.Columns.Count;
        int Pointrow = 1;
        int expVar = 75000;
        int Pointcolumn = expVar;
        int co = 0;
        int r = 0;
        expVar = Userows > expVar ? expVar : Userows;
        decimal lcount = Convert.ToDecimal(Userows) / Convert.ToDecimal(expVar);
        Int32 lcountint = Convert.ToInt32(Math.Ceiling(lcount));
        DataTable dt = new DataTable();
        if (isHeader == true)
        {
            int duplicateColum = 1;
            for (int j = 1; j <= excelRange.Columns.Count; j++) // Header Names
            {
                if (excelRange.Cells[1, j].Value2 != null)
                {
                    if (!dt.Columns.Contains(Convert.ToString(excelRange.Cells[1, j].Value2).Trim()))
                    {
                        dt.Columns.Add(Convert.ToString(excelRange.Cells[1, j].Value2).Trim());
                    }
                    else
                    {
                        dt.Columns.Add(Convert.ToString(excelRange.Cells[1, j].Value2).Trim() + duplicateColum.ToString());
                        duplicateColum++;
                    }
                }
                else
                {
                    dt.Columns.Add("Column" + j.ToString());
                    duplicateColum++;
                }
            }
        }
        else
        {
            for (int j = 1; j <= excelRange.Columns.Count; j++) // Header Names
                dt.Columns.Add("Column" + j.ToString());
        }

        string cell = string.Empty;
        string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int colCharsetLen = colCharset.Length;
        if (dt.Columns.Count > colCharsetLen)
        {
            cell = colCharset.Substring(
                (dt.Columns.Count - 1) / colCharsetLen - 1, 1);
        }

        cell += colCharset.Substring(
                (dt.Columns.Count - 1) % colCharsetLen, 1);


        for (int i = 0; i < lcountint; i++)
        {
            string cell1 = "A" + Convert.ToString(Pointrow);
            string cell2 = cell + Convert.ToString(Pointcolumn);
            excellt.Range rng = sh.get_Range(cell1, cell2);
            object[,] x = (object[,])rng.get_Value(excellt.XlRangeValueDataType.xlRangeValueDefault);
            int NumRow = isHeader == true && isFirstTime == true ? 2 : 1;

            int loopUpto = Userows > expVar ? (Pointcolumn - Pointrow) : expVar;
            loopUpto += 2;

            isFirstTime = false;
            while (NumRow < loopUpto)
            {
                dt.Rows.Add();
                co = 0;
                for (int c = 1; c <= Usecolumns; c++)
                {
                    dt.Rows[r][co] = Convert.ToString(x[NumRow, c]);
                    co++;
                }
                NumRow++;
                r++;
            }
            Pointrow += expVar;
            Pointcolumn += expVar;
            Pointcolumn = (Pointcolumn >= Userows) ? Userows : Pointcolumn;

            progressBar1.Value += 10;
        }

        GC.Collect();
        GC.WaitForPendingFinalizers();
        if (ExcelApp != null)
        {
            ExcelApp.Quit();
            int hWnd = ExcelApp.Application.Hwnd;
            uint processID; GetWindowThreadProcessId((IntPtr)hWnd, out processID);
            Process[] procs = Process.GetProcessesByName("EXCEL");
            foreach (Process p in procs)
            {
                if (p.Id == processID)
                    p.Kill();
            }
            Marshal.FinalReleaseComObject(ExcelApp);
        }

        return dt;
    }

答案 2 :(得分:1)

我希望客户按小时付款,因为这些是愚蠢的解决方案限制(除非存在情有可原的情况)

然而,Excel电子表格的XML格式实际上并没有那么糟糕的编写代码。较新版本的EXcel将打开.xml文件并将其视为电子表格。您可以以.xml格式嵌入格式,标题等,并且由于XML是结构化的,因此它比通过代码编写大量字节数据更具可维护性。

使用excel,以正确的格式创建文档,将其用作模板,然后根据需要进行调整。确保你有一个不错的XML编辑器和耐心。

答案 3 :(得分:0)

我认为Text-Tab Delimited比尝试CSV生成器更简单,更快速。如果您在设计阶段不小心并仔细检查数据的所有预期变化,CSV有时可能会有奇怪的怪癖。 CSV将需要文本限定符等。除非您期望您的数据到处都有TAB,否则TAB分隔文件非常容易。