C# 将XLX转换为csv和数据格式
我在转换文件时遇到两个问题:C# 将XLX转换为csv和数据格式,c#,.net,excel,save,converters,C#,.net,Excel,Save,Converters,我在转换文件时遇到两个问题: 我希望日期格式如下所示: 看起来是这样的 8/19/2019 2.转换后,csv文件中将添加带逗号的其他行。我怎样才能克服这个问题 11,900011,S1,8/19/2019,11,6.90,9.90,,18.50,,8.80,,,,,,,,,,,,,,,,,,,,,,,, 12,900012,S1,8/19/2019,12,6.70,8.80,,14.50,,9.40,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,
8/19/2019
2.转换后,csv文件中将添加带逗号的其他行。我怎样才能克服这个问题
11,900011,S1,8/19/2019,11,6.90,9.90,,18.50,,8.80,,,,,,,,,,,,,,,,,,,,,,,,
12,900012,S1,8/19/2019,12,6.70,8.80,,14.50,,9.40,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
....
我使用图书馆
using Excel=Microsoft.Office.Interop.Excel;
这是我的代码:
public static void Convert()
{
try
{
Excel.Application app = new Excel.Application();
//Load file . xlsx
Excel.Workbook wb = app.Workbooks.Open(Program.filePaths[1]);
//Save file .csv
wb.SaveAs(Program.filePaths[0], Excel.XlFileFormat.xlCSVWindows, Type.Missing, Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlLocalSessionChanges, false, Type.Missing, Type.Missing, Type.Missing);
wb.Close(false);
app.Quit();
}catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
提前感谢您的帮助我使用npoi将excel转换为csv (很抱歉,这里丢失了字符串,这是我的项目的副本)
公共字典exceltosv(IWorkbook输入)
{
var csvTrennzeichen=OutputSettings.columnselector.ToString();
var result=newdictionary();
对于(var sheetIndex=0;sheetIndexstring.IsNullOrEmpty(WertAuslesen(x)))
继续;
var line=string.Join(csvTrennzeichen,rowObj.Cells
。选择(单元格=>WertAuslesen(单元格)。替换(“\r”和“”)。替换(“\n”和“”)
.Select(cell=>OutputSettings.writeInNotes?string.Format(“\”{0}\”,cell.Replace(“\”,“\”):cell));
sheetresult.Add(行);
}
添加(sheet.SheetName,string.Join(“\r\n”,sheetresult));
}
返回结果;
}
私有字符串WertAuslesen(ICell oldCell)
{
开关(oldCell.CellType)
{
大小写单元格类型。布尔值:
返回oldCell.BooleanCellValue.ToString();
案例单元格类型。错误:
返回oldCell.ErrorCellValue.ToString();
案例单元类型。公式:
返回oldCell.CellFormula;
大小写单元格类型。数字:
return!DateUtil.IsCellDateFormatted(oldCell)
?oldCell.NumericCellValue.ToString(OutputSettings.GetDecimalFormat(数字(oldCell.CellStyle.GetDataFormatString()))
:oldCell.DateCellValue.ToString(OutputSettings.DateFormat);
大小写CellType.String:
返回oldCell.RichStringCellValue.ToString();
案例单元类型。未知:
返回oldCell.StringCellValue;
违约:
返回“”;
}
}
专用静态整数位数(字符串格式)
{
var digits=format.ContainsAny(',','。)?format.Split(new[]{',','.'.})。Last():“”;
返回数字。长度;
}
我还觉得有必要添加outputsettings类,因为它可以清除一切,这不是必需的
public class OutputSettings
{
public static readonly OutputSettings Default = new OutputSettings(Encoding.UTF8, null, "yyyyMMdd", "hh:mm:ss", ".", "", "y", "n", ',', true, "", null);
//I am immutable
public OutputSettings(CultureInfo culture) : this(
Encoding.UTF8,
null,
culture.DateTimeFormat.ShortDatePattern,
culture.DateTimeFormat.LongTimePattern,
culture.NumberFormat.NumberDecimalSeparator,
culture.NumberFormat.NumberGroupSeparator,
"y",
"n",
',',
true,
"",
null)
{
}
public OutputSettings(
Encoding encoding,
Version ioVersion,
string dateFormat,
string timeFormat,
string decimalSeperator,
string thousandSeperator,
string yesString,
string noString,
char columnseperator,
bool writeinquotes,
string outputFolder,
IResourceHandler resourceHandler)
{
Encoding = encoding;
IOVersion = ioVersion;
DateFormat = dateFormat;
TimeFormat = timeFormat;
DecimalSeperator = decimalSeperator;
ThousandSeperator = thousandSeperator;
YesString = yesString;
NoString = noString;
ColumnSeparator = columnseperator;
Writeinquotes = writeinquotes;
OutputFolder = outputFolder;
ResourceHandler = resourceHandler;
}
public IResourceHandler ResourceHandler { get; }
public Encoding Encoding { get; }
public Version IOVersion { get; }
public string DateFormat { get; }
public string TimeFormat { get; }
public string DateTimeFormat => DateFormat + " " + TimeFormat;
public string DecimalSeperator { get; }
public string ThousandSeperator { get; }
public string DecimalFormat => GetDecimalFormat(2);
public string YesString { get; }
public string NoString { get; }
private char _columnseperator;
public char ColumnSeparator
{
get
{
return _columnseperator;
}
private set
{
if (value != ',' && value != ';')
throw new ArgumentException(Localization.Resources.StaticTranslationResource.IO_SEPARATOR_MUSS_COMMA_ODER_SEMICOLON_SEIN);
_columnseperator = value;
}
}
public bool Writeinquotes { get; }
public string OutputFolder { get; set; }
public string GetDecimalFormat(int precision)
{
if (precision < 0)
throw new ArgumentException(Localization.Resources.StaticTranslationResource.OUTPUT_ANZAHL_DER_STELLEN_DARF_NICHT_NEGATIV_SEIN, nameof(precision));
var sb = new StringBuilder($"#{ThousandSeperator}##0{DecimalSeperator}");
if (precision == 0)
{
sb.Append('#');
}
else
{
for (int i = 0; i < precision; i++)
{
sb.Append('0');
}
}
return sb.ToString();
}
}
公共类输出设置
{
public static readonly OutputSettings Default=new OutputSettings(Encoding.UTF8,null,“yyyyMMdd”,“hh:mm:ss”,“y”,“n”,“n”,“true”,“null”);
//我是不变的
公共输出设置(CultureInfo区域性):此(
Encoding.UTF8,
无效的
culture.DateTimeFormat.ShortDatePattern,
culture.DateTimeFormat.LongTimePattern,
culture.NumberFormat.NumberDecimalSeparator,
culture.NumberFormat.NumberGroupSeparator,
“y”,
“n”,
',',
是的,
"",
空)
{
}
公共输出设置(
编码,
版本ioVersion,
字符串日期格式,
字符串时间格式,
字符串小数分隔符,
字符串千分位器,
字符串是字符串,
弦鼻音,
炭柱分离器,
布勒写的信,
字符串输出文件夹,
IResourceHandler(resourceHandler)
{
编码=编码;
IOVersion=IOVersion;
DateFormat=DateFormat;
TimeFormat=TimeFormat;
小数分隔符=小数分隔符;
千分位=千分位;
是字符串=是字符串;
鼻音=鼻音;
柱分离器=柱分离器;
WriteInNotes=WriteInNotes;
OutputFolder=OutputFolder;
ResourceHandler=ResourceHandler;
}
公共IResourceHandler ResourceHandler{get;}
公共编码编码{get;}
公共版本IOVersion{get;}
公共字符串日期格式{get;}
公共字符串时间格式{get;}
公共字符串DateTimeFormat=>DateFormat+“”+TimeFormat;
公共字符串小数分隔符{get;}
公共字符串千分位符{get;}
公共字符串DecimalFormat=>GetDecimalFormat(2);
公共字符串YesString{get;}
公共字符串NoString{get;}
专用字符分隔器;
公共字符列分隔符
{
得到
{
返回柱分离器;
}
专用设备
{
如果(值!=','&&value!=';')
抛出新的ArgumentException(Localization.Resources.StaticTranslationResource.IO_SEPARATOR_MUSS_逗号_order_分号_SEIN);
_列分隔符=值;
}
}
公共bool writeinquetes{get;}
公共字符串OutputFolder{get;set;}
公共字符串GetDecimalFormat(整数精度)
{
if(精度<0)
抛出新的ArgumentException(Localization.Resources.StaticTranslationResource.OUTPUT_ANZAHL_DER_STELLEN_DARF_NICHT_Negative_SEIN,nameof(precision));
var sb=新的StringBuilder($“{MilliandSeperator}}{0{DecimalSeperator}”);
如果(精度==0)
{
某人附加(“#”);
}
其他的
{
对于(int i=0;i
编辑:我使用了很多扩展方法使我的代码可读
康萨尼就是其中之一
public static bool ContainsAll<T>(this IEnumerable<T> superset, params T[] subset) => !subset.Except(superset).Any();
public static bool ContainsAll<T>(this IEnumerable<T> superset, IEnumerable<T> subset) => !subset.Except(superset).Any();
public static bool ContainsAny<T>(this IEnumerable<T> superset, params T[] subset) => subset.Any(superset.Contains);
public static bool ContainsAny<T>(this IEnumerable<T> superset, IEnumerable<T> subset) => subset.Any(superset.Contains);
公共静态bool Contai
public class OutputSettings
{
public static readonly OutputSettings Default = new OutputSettings(Encoding.UTF8, null, "yyyyMMdd", "hh:mm:ss", ".", "", "y", "n", ',', true, "", null);
//I am immutable
public OutputSettings(CultureInfo culture) : this(
Encoding.UTF8,
null,
culture.DateTimeFormat.ShortDatePattern,
culture.DateTimeFormat.LongTimePattern,
culture.NumberFormat.NumberDecimalSeparator,
culture.NumberFormat.NumberGroupSeparator,
"y",
"n",
',',
true,
"",
null)
{
}
public OutputSettings(
Encoding encoding,
Version ioVersion,
string dateFormat,
string timeFormat,
string decimalSeperator,
string thousandSeperator,
string yesString,
string noString,
char columnseperator,
bool writeinquotes,
string outputFolder,
IResourceHandler resourceHandler)
{
Encoding = encoding;
IOVersion = ioVersion;
DateFormat = dateFormat;
TimeFormat = timeFormat;
DecimalSeperator = decimalSeperator;
ThousandSeperator = thousandSeperator;
YesString = yesString;
NoString = noString;
ColumnSeparator = columnseperator;
Writeinquotes = writeinquotes;
OutputFolder = outputFolder;
ResourceHandler = resourceHandler;
}
public IResourceHandler ResourceHandler { get; }
public Encoding Encoding { get; }
public Version IOVersion { get; }
public string DateFormat { get; }
public string TimeFormat { get; }
public string DateTimeFormat => DateFormat + " " + TimeFormat;
public string DecimalSeperator { get; }
public string ThousandSeperator { get; }
public string DecimalFormat => GetDecimalFormat(2);
public string YesString { get; }
public string NoString { get; }
private char _columnseperator;
public char ColumnSeparator
{
get
{
return _columnseperator;
}
private set
{
if (value != ',' && value != ';')
throw new ArgumentException(Localization.Resources.StaticTranslationResource.IO_SEPARATOR_MUSS_COMMA_ODER_SEMICOLON_SEIN);
_columnseperator = value;
}
}
public bool Writeinquotes { get; }
public string OutputFolder { get; set; }
public string GetDecimalFormat(int precision)
{
if (precision < 0)
throw new ArgumentException(Localization.Resources.StaticTranslationResource.OUTPUT_ANZAHL_DER_STELLEN_DARF_NICHT_NEGATIV_SEIN, nameof(precision));
var sb = new StringBuilder($"#{ThousandSeperator}##0{DecimalSeperator}");
if (precision == 0)
{
sb.Append('#');
}
else
{
for (int i = 0; i < precision; i++)
{
sb.Append('0');
}
}
return sb.ToString();
}
}
public static bool ContainsAll<T>(this IEnumerable<T> superset, params T[] subset) => !subset.Except(superset).Any();
public static bool ContainsAll<T>(this IEnumerable<T> superset, IEnumerable<T> subset) => !subset.Except(superset).Any();
public static bool ContainsAny<T>(this IEnumerable<T> superset, params T[] subset) => subset.Any(superset.Contains);
public static bool ContainsAny<T>(this IEnumerable<T> superset, IEnumerable<T> subset) => subset.Any(superset.Contains);
Excel.Worksheet sheet = wb.ActiveSheet;
sheet.Columns[4].NumberFormat = "yyyy.mm.dd";
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell,
Type.Missing);
for (int row = last.Row; row > 0; row++)
{
Excel.Range r = (Excel.Range)sheet.Cells[row, 1];
double o = addIn.Application.WorksheetFunction.CountA(r.EntireRow);
if (o == 0)
r.EntireRow.Delete();
}