programing

Excel 스프레드시트에서 열이 누락됨

telecom 2023. 8. 13. 09:33
반응형

Excel 스프레드시트에서 열이 누락됨

저는 송장 목록을 가지고 있고 엑셀 스프레드시트로 전송했습니다.

enter image description here

작업 날짜 열을 제외한 모든 열이 스프레드시트에 생성됩니다.그것은 스프레드시트에서 비어 있습니다.

코드는 다음과 같습니다.

string Directory = ConfigurationSettings.AppSettings["DownloadDestination"] + Company.Current.CompCode + "\\";
string FileName = DataUtils.CreateDefaultExcelFile(Company.Current.CompanyID, txtInvoiceID.Value, Directory);
FileInfo file = new FileInfo(FileName);
Response.Clear();
Response.ContentType = "application/x-download";
Response.AddHeader("Content-Length", file.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.CacheControl = "public";
Response.TransmitFile(file.FullName);
Response.Flush();
Context.ApplicationInstance.CompleteRequest();

public static string CreateDefaultExcelFile(int CompanyID, string InvoiceNo, string CreateDirectory)
{
        List<MySqlParameter> param = new List<MySqlParameter>{ 
                { new MySqlParameter("CompanyID", CompanyID) },
                { new MySqlParameter("InvoiceNo", InvoiceNo) }
        };

        DataTable result = BaseDisplaySet.CustomFill(BaseSQL, param);

        string FileName = CreateDirectory + "InvoiceFile_" + DateTime.Now.ToString("yyyyMMddhhmmssff") + ".";
        FileName += "xlsx";
        XLWorkbook workbook = new XLWorkbook();
        workbook.Worksheets.Add(result, "Bulk Invoices");
        workbook.SaveAs(FileName);
        return FileName;
}

 private const string BaseSQL = " SELECT q.InvoiceNo AS InvoiceNumber, j.JobNo, j.JobDate AS JobDate, " +
             " (SELECT Name FROM job_address WHERE AddressType = 6 AND JobID = j.ID LIMIT 0,1) AS DebtorName,  " +
             " (SELECT CONCAT(Name,CONCAT(',',Town)) FROM job_address WHERE AddressType = 3 AND JobID = j.ID LIMIT 0,1) AS CollectFrom, " +
             " (SELECT CONCAT(Name,CONCAT(',',Town)) FROM job_address WHERE AddressType = 2 AND JobID = j.ID LIMIT 0,1) AS DeliverTo, " +
             " deladd.Town AS DeliverToTown,  deladd.County AS DeliveryToCounty, " +
             " (SELECT DocketNo FROM job_dockets WHERE JobID = j.ID LIMIT 0,1) AS DocketNo, " +
            " SUM(j.DelAmt) AS DelAmount, " +
             " (SELECT CAST(group_concat(DISTINCT CONCAT(AdvisedQty,' ',PieceType) separator ',') AS CHAR(200)) FROM  job_pieces WHERE JobID = j.ID GROUP BY JobID ) AS PieceBreakDown  " +
            " FROM Invoice q   " +
            " LEFT JOIN customer c ON q.accountcode = c.ID " +
            " INNER JOIN job_new j ON q.JobID = j.ID " +
            " LEFT JOIN job_address coladd ON coladd.JobID = j.ID AND coladd.AddressType = 3 " +
            " LEFT JOIN job_address deladd ON deladd.JobID = j.ID AND deladd.AddressType = 2 " +
            " WHERE q.IsActive = 1 AND q.Company_ID = ?CompanyID AND q.InvoiceNo = ?InvoiceNo " +
            " group by j.id";

sql은 모든 올바른 정보를 반환하며 작업 날짜는 다음과 같습니다.

enter image description here

그러나 Excel 파일이 생성된 후 파일을 열면 작업 날짜 열이 비어 있습니다.

enter image description here

기준에서 작업 날짜를 변환해야 합니다.SQL을 문자열로 지정합니다.

아래에 예제가 나와 있습니다.이를 사용하여 날짜 시간을 바르샤르로 변환하는 방법에 대한 아이디어를 얻을 수 있습니다.

DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

--
-- Convert string
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

Excel로 데이터를 내보내는 데 어떤 프레임워크를 사용하고 얼마나 강력한지는 모르지만, Excel이 날짜(깜짝!)를 직접 지원하지 않는다는 것은 알고 있습니다. 적어도 xml 기반(OpenXml) xlsx 문서에서는 그렇지 않습니다.문자열 및 숫자(기본 문서에 문자열 및 숫자 리터럴로 저장됨)에만 사용할 수 있습니다.
이를 고려하여 간단한 해결 방법을 사용할 수 있습니다. sql의 캐스트/변환 또는 C#의 ToString()을 통해 날짜를 문자열로 변환합니다.분명히 Excel 날짜 기능(날짜 필터, 사용자 지정 형식 등)이 해제될 것입니다.
하지만, 이것이 유일한 방법은 아닙니다.Excel이 데이터를 저장하는 것과 동일한 방법으로 데이터를 저장할 수 있습니다.프레임워크에서 지원하지 않는 경우 직접 수행해야 합니다. 레시피는 DocumentFormat을 사용하여 수동으로 xlsx 문서를 생성하는 것과 동일합니다.Xml.dll을 엽니다.
실제로 Excel은 날짜에 대한 내부 표현으로 "OLE-Automation Date" 형식을 사용합니다. 이 형식은 1899년 12월 30일 자정 전후의 날짜를 정수 성분으로 하고 해당 날짜의 시간을 24로 나눈 분수 성분의 부동 소수점 번호로 구현됩니다.이 표현은 문서에 숫자 리터럴로 저장됩니다.Excel은 해당 셀의 번호 형식으로 날짜와 숫자를 구분합니다.이러한 점을 고려하여 다음과 같은 간단한 해결 방법을 사용할 수 있습니다.
먼저 날짜를 숫자로 변환합니다.

DateTime date = DateTime.Now;
double dateValue = date.ToOADate();
//or
TimeSpan time = DateTime.Now.TimeOfDay;
double timeValue = (DateTime.FromOADate(0) + time).ToOADate();

그런 다음 이중 변수를 Excel Cell의 CellValue로 설정해야 합니다. 다음을 사용하여 새 열을 생성할 수 있습니다.doubleDataTable에 데이터 유형을 입력하고 이 변환을 사용하여 데이터 유형을 입력한 다음 원래 DateTime 열을 삭제합니다.
둘째, 원하는 셀에 날짜 형식을 적용합니다.안타깝게도 필수 코드는 프레임워크마다 다르겠지만 원칙은 같아야 합니다.

  1. 해당 셀 범위 찾기(셀 범위 또는 셀, 열)
  2. 문자열을 예:range.NumberFormat.Format="dd/mm/yyyy"또는range.NumberFormatString="dd/mm/yyyy")

그러나 이 프레임워크가 단순화된 형식을 지원하지 않는 경우(매우 이상한 프레임워크가 될 것입니다), 다음 중 하나를 설정해야 합니다.range.NumberFormatId=22표준 날짜 형식의 경우 또는 새 숫자 형식을 만듭니다.운이 나쁘고 이 프레임워크가 문서 형식만큼 간단한 경우.하는 NumberOpenXml, "CellFormat"을 하여 사용자 .FormatId(22 또는 사용자 지정 번호의 ID)에 추가하여 합니다.), 범위에 대한 를 설정합니다.해당 범위에 대한 인덱스입니다.

확인해 볼 가치가 있는지는 모르겠지만, 과거에 대규모 데이터셋과 데이터 테이블을 사용할 때는 대개 ClosedX를 사용합니다.그것을 완성하기 위한 ML.데이터 테이블을 전달하고 해당 테이블에 대한 XLSX 생성을 처리하도록 하는 것은 쉽습니다.Windows Server 2008 r2를 여러 시트로 대량 요청을 처리하는 문제 없이 실행할 수 있기 때문에 매우 잘 작동합니다.

https://closedxml.codeplex.com/

언급URL : https://stackoverflow.com/questions/36999746/column-missing-from-excel-spreedshet

반응형