我在.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();
}
问题是文件中我有A列中的数据。我想将DataRow格式的一行粉碎成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”也没有帮助。
答案 0 :(得分: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();
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我倾向于同意@Hossein。我认为这是一个编码问题。我完全按照我的机器运行你的代码,它运行得很好。
答案 3 :(得分:0)
自从你在一年前写下这个问题以来,你仍然没有找到解决方案:
您可以使用非常受欢迎的KBCSV库,它可以处理您需要的所有内容。它默认使用csv,但可以很容易地修改以处理tsv。
对于一个非常简单易破解的解决方案,您可以尝试: string.Join(“\ t”,rzad)+“\ r \ n”
这不会考虑包含标签的字段。如果某个字段包含制表符,则会使此方法无效。通常,包含分隔符的字段是双引号,包含双引号的字段是双引号。
实现这一点并不困难,但它会重新发明轮子,因为Kent Boogart已经花了很多时间考虑了一些我不会注意到的边缘情况。
答案 4 :(得分:0)
以下函数用于编写csv文件。
public static void WriteCSV(string file, string content)
{
using (StreamWriter sw = new StreamWriter(file))
{
sw.Write(content);
}
}
然后通过
调用此函数string appendText = "";
for (int i = 0; i < iColCount; i++)
{
if (!Convert.IsDBNull(rzad[i]))
{
appendText += appendText == "" ? rzad[i].toString() : "," + rzad[i].toString();
}
}
WriteCSV("C:\\out\\out.csv",appendText);
多行的另一个简单示例,每一行用新行字符分隔&#39; \ n&#39;。
WriteCSV("C:\\out\\out.csv","a,b,c,d,e,f,g\nh,i,j,k,l,m,n\n");
答案 5 :(得分:0)
if (editLabelsDT != null)
{
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet();
sheet.ProtectSheet(Resource.Input_ExportEditMeasureLabel);
ICellStyle styleEditableCells = workbook.CreateCellStyle();
styleEditableCells.IsLocked = false;
styleEditableCells.WrapText = true;
ICellStyle styleForNonEditableCells = workbook.CreateCellStyle();
styleForNonEditableCells.IsLocked = true;
styleForNonEditableCells.FillPattern = FillPattern.AltBars;
styleForNonEditableCells.FillBackgroundColor = NPOI.SS.UserModel.IndexedColors.Grey25Percent.Index;
styleForNonEditableCells.WrapText = true;
//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);
int rowNumber = 1;
//Populate the sheet with values from the grid data
foreach (DataRow dr in editLabelsDT.Rows)
{
//Create a new row
var row = sheet.CreateRow(rowNumber++);
for (int i = 0; i < editLabelsDT.Columns.Count; i++)
{
ICell cell1 = row.CreateCell(i);
if (i == 0)
cell1.CellStyle = styleForNonEditableCells;
else
cell1.CellStyle = styleEditableCells;
//Set values for the cells
cell1.SetCellValue(dr[i].ToString());
}
}
答案 6 :(得分:0)
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dt, "Customers");
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=SqlExport.xlsx");
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
MyMemoryStream.WriteTo(Response.OutputStream);
Response.Flush();
Response.End();
}
}
}
}