0

データを .csv ファイルに保存するのに問題があります。

     void WriteLog(DataRow rzad)
    {
            StreamWriter sw = new StreamWriter("log.csv", true);
            int iColCount = 8;

            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(rzad[i]))
                {
                    sw.Write(rzad[i].ToString());
                    sw.Write("\t");
                }
            }
            sw.Write("\n");
            sw.Flush();
            sw.Close();
    }

問題はファイルの tak です。A 列にデータがあります。DataRow 形式の 1 つの行を 8 つの部分に分割して、8 つの異なる列に配置したいと考えています。タブ(「\ t」)が表示されないため、私の機能は機能しています。

画像を投稿できないので、csv ファイルで結果を記述しようとしています。

2011-03-17 14:34:11asdPrzekroczono krytyczną minimalną wymaganą wartość parametru5010050080550

これは私の例の行で、8 列に分割したいと考えています。

2011-03-17 14:34:11     asd     Przekroczono krytyczną minimalną wymaganą wartość parametru   50     100    500     80      550     

「#\t#」は役に立ちません。結果は次のとおりです。

"2011-03-17 18:29:17#   #asd#   #Przekroczono krytyczną, maksymalną, wymaganą wartość parametru#    #560#   #100#   #500#   #80#    #550#   #"

いくつかの表がありますが、私のポイントは、スペースがなく、次のセルへの移行が行われたということです:(

「\u0008」も役に立ちません。

4

7 に答える 7

1

まず、CSV(カンマ区切り値)ファイルに書き込んでいると言います。しかし、実際にはタブ区切りファイルに書き込んでいます。そして、行の間に/ r/nを書く必要があります。

これは機能します:

    StreamWriter sw = new StreamWriter(@"c:\log.csv", true); 
    int iColCount = 8; 
    for (int i = 0; i < iColCount; i++)
    {           
        {
            sw.Write(i.ToString()); 
            sw.Write("\t"); 
        } 
    } 
    sw.Write("\r\n"); 
    sw.Flush(); 
    sw.Close();
于 2011-03-17T21:37:13.457 に答える
1
private ActionResult ExportMeasuresWithTabsFromClient(DataSet spendData,
                                                      string excelFileName,
                                                      bool isFirstColumnDateAndRestDouble = false
                                                      //int numberFormatStartingColumnNumber = -1,
                                                      //int dateFieldColumn = -1)
{
    var fileName = "Bulk Export" + Guid.NewGuid() + ".xlsx";
    // Checking whether the directly exist and save the file to server temp folder
    bool exists = System.IO.Directory.Exists(Server.MapPath("~/" + Resource.ExportLocationTemp));// Common temp location for export as it is not saving the file in the location
    if (!exists)
    {
        DirectoryInfo di = System.IO.Directory.CreateDirectory(Server.MapPath("~/" + Resource.ExportLocationTemp));
        if (di == null || !di.Exists)
        {
            var msg = $"{Resource.MP_CreateDirectory_Failed} '{Resource.ExportLocationTemp}'.";
            _log.Error(msg);
            throw new Exception(msg);
        }
    }

    var fullPath = Path.Combine(Server.MapPath("~/" + Resource.ExportLocationTemp), fileName);
    _log.Info("Entering ExportMeasuresWithTabsFromClient");
    //Write the workbook to a memory stream
    MemoryStream output = new MemoryStream();
    try
    {
        XSSFWorkbook workbook = new XSSFWorkbook();
        foreach (DataTable dt in spendData.Tables)
        {
            if (getOneWorksheet(workbook, dt))  //, isFirstColumnDateAndRestDouble, numberFormatStartingColumnNumber, dateFieldColumn))
                _log.Info($"Created worksheet for TableName: '{dt.TableName}'");
            else
                _log.Error($"Failed to create worksheet for TableName: '{dt.TableName}'");
        }

        using (FileStream file = new FileStream(fullPath, FileMode.Create, FileAccess.Write))
        {
            workbook.Write(file);
        }

        //Return the result to the end user
        //TempData.Add("downloadStatus", 1);
        _log.Info("Exiting ExportMeasuresWithTabsFromClient");



    }
    catch (Exception ex)
    {
        _log.Error(ex.Message, ex);
        _log.Info("Error in ExportMeasuresWithTabsFromClient");
    }
    return Json(fileName);
    //Suggested file name in the "Save as" dialog which will be displayed to the end user
}

private bool getOneWorksheet(XSSFWorkbook workbook,
                             DataTable dataTable,
                             bool isFirstColumnDateAndRestDouble = false)
{
    _log.Info("Entering getOneWorksheet");
    try
    {
        //Create new Excel sheet
        //var sheet = workbook.CreateSheet(getSheetName(dataTable));
        var sheet = workbook.CreateSheet(dataTable.TableName);

        //Create a header row
        var headerRow = sheet.CreateRow(0);

        //(Optional) freeze the header row so it is not scrolled
        sheet.CreateFreezePane(0, 1, 0, 1);

        // Setting for the styles for edited cells
        ICellStyle styleEditableCells = workbook.CreateCellStyle();
        styleEditableCells.IsLocked = false;
        styleEditableCells.WrapText = true;

        // Setting for the styles for non edited cells
        ICellStyle styleForNonEditableCells = workbook.CreateCellStyle();
        styleForNonEditableCells.IsLocked = true;
        styleForNonEditableCells.FillPattern = FillPattern.AltBars;
        styleForNonEditableCells.FillBackgroundColor = NPOI.SS.UserModel.IndexedColors.Grey25Percent.Index;
        styleForNonEditableCells.WrapText = true;
        int rowNumber = 1;
        //Populate the sheet with values from the grid data.
        foreach (DataRow dataRow in dataTable.Rows)
        {
            //Create a new row in Excel sheet.
            var excelRow = sheet.CreateRow(rowNumber++);
            for (int column = 0; column < dataTable.Columns.Count; column++)
            {
                ICell cell = excelRow.CreateCell(column);
                if (isFirstColumnDateAndRestDouble) // if this true --> ROI -> SaveAndDownload button (only for that) 
                {
                    // Protecting the sheet and setting the styles (editing and non editing)
                    sheet.ProtectSheet(Resource.Modeling_Roi_SaveDonwloadexcelPassword);
                    if (column == 0 || column == 1)
                        cell.CellStyle = styleForNonEditableCells;
                    else
                        cell.CellStyle = styleEditableCells;
                }
                //Set values for the cells
                double value;
                if (double.TryParse(dataRow[column].ToString(), out value))
                    cell.SetCellValue(value);
                else
                    cell.SetCellValue(dataRow[column].ToString());
            }
        }
        for (int column = 0; column < dataTable.Columns.Count; column++) // Looping and wraping the column values
        {
            headerRow.CreateCell(column).SetCellValue(dataTable.Columns[column].ColumnName);
            sheet.AutoSizeColumn(column);
            if (sheet.GetColumnWidth(column) / 255 < 254)  /// DDE 1.5 6170 --> Handling the higher exponential value
            {
                sheet.SetColumnWidth(column, sheet.GetColumnWidth(column) + (2 * 256));
            }
        }
        return true;
    }
    catch (Exception ex)
    {
        _log.Error(ex.Message, ex);
        _log.Info("Error in getOneWorksheet");
    }
    return false;
}
于 2021-07-07T13:21:35.840 に答える
0

1年前にこの質問を書いた後、まだ解決策が見つからない場合に備えて、次のようにします。

非常に人気があり、必要なほとんどすべてを処理するKBCSVライブラリを使用できます。デフォルトではcsvを使用しますが、tsvを処理するように簡単に変更できます。

非常にシンプルで簡単に壊れやすいソリューションについては、string.Join( "\ t"、rzad)+ "\ r\n"を試すことができます。

これは、タブを含むフィールドを考慮しません。フィールドにタブが含まれていると、このメソッドは役に立たなくなります。通常、区切り文字を含むフィールドは二重引用符で囲まれ、二重引用符を含むフィールドは二重二重引用符で囲まれます。

これを実装するのはそれほど難しいことではありませんが、Kent Boogartが私が気付かないいくつかのエッジケースを考慮してすでに何時間も費やしているので、車輪の再発明になるでしょう。

于 2012-11-27T22:15:50.233 に答える
0

@Hosseinに同意する傾向があります。エンコーディングの問題だと思います。私のマシンであなたのコードをそのまま実行したところ、完全に機能しました。

于 2011-03-17T22:09:37.337 に答える